====時間====
程序計算時間有兩種參考:
1.牆上的時間,也就是實際生活中使用的時間
2.處理的時間,也就是CPU執行程序使用了多少時間
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
得到標准的calendar time時間,成功返回0,錯誤返回-1
#include <time.h>
time_t time(time_t *timep);
得到Epoch時間到目前為止的秒數,-1表示出錯
#include <time.h>
char *ctime(const time_t *timep);
將當前時間轉為簡單的字符串描述,格式類似
Wed Jun 8 14:22:34 2011, 返回NULL表示出錯
#include <time.h>
struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);
前者轉換time_t類型的值為UTC標准的時間結構,後者轉為本地化的時間結果
返回NULL表示處理出錯
#include <time.h>
time_t mktime(struct tm *timeptr);
轉換相應的時間結構為Epoch時間到目前為止的秒數,-1表示出錯
#include <time.h>
size_t strftime(char *outstr, size_t maxsize, const char *format,
const struct tm *timeptr);
將一個時間結構按照格式format,轉換為一個字符串表示,寫入outstr,成功
返回實際寫入的字節數,-1表示出錯
#define _XOPEN_SOURCE
#include <time.h>
char *strptime(const char *str, const char *format, struct tm *timeptr);
將一個滿足時間表示格式format的字符串,轉換為一個時間結構,成功返回下一個
沒被處理的字符地址,NULL表示出錯
====系統資源====
#include <unistd.h>
long sysconf(int name);
運行時獲取系統各項配置信息,返回值由name決定,-1表示出錯
#include <unistd.h>
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);
獲取文件路徑的最大表示長度,-1表示出錯
#include <sys/utsname.h>
int uname(struct utsname *utsbuf);
得到操作系統的相關信息,-1表示出錯
====文件緩沖====
#include <stdio.h>
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
設置文件流的緩沖大小,-1表示出錯
mode的值如下<默認是_IOFBF>
_IOFBF(滿緩沖) 當緩沖區為空時,從流讀入或寫入數據
_IOLBF(行緩沖) 每次從流中讀入一行數據或向流中寫入一行數據
_IONBF(無緩沖) 直接讀入/寫入數據,無需緩沖,忽略buf, size參數
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
buf為NULL,設置文件流不需要緩沖;否則設置滿緩沖模式,buf的大小
必須為BUFSIZE的大小
#define _BSD_SOURCE
#include <stdio.h>
void setbuffer(FILE *stream, char *buf, size_t size);
同上的功能,不過可以指定緩沖大小為size
#include <stdio.h>
int fflush(FILE *stream);
刷新緩沖,同步緩沖內容到文件流stream中,EOF表示出錯,0表示成功
#include <stdio.h>
int fileno(FILE *stream);
得到文件流的文件描述符,-1表示出錯
FILE *fdopen(int fd, const char *mode);
得到文件描述符的文件流,NULL表示出錯
#include <sys/mount.h>
int mount(const char *source, const char *target,
const char *fstype, unsigned long mountflags, const void *data);
掛載文件系統,類似mount命令,source表示需要掛載的文件系統,target表示
掛載點,fstype表示掛載的source文件系統類型,mountflags,data是掛載文件
系統的相關選項參數,返回0表示成功,-1表示出錯
#include <sys/mount.h>
int umount(const char *target);
卸除掛載點,返回0成功,-1失敗
#include <sys/stat.h>
int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
獲取文件的屬性信息,返回0表示成功,-1失敗;lstat,stat的區別在於
如果文件是一個鏈接文件時,lstat獲取鏈接文件本身信息,而非鏈接的對象文件
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
#define _XOPEN_SOURCE 500 /* Or: #define _BSD_SOURCE */
#include <unistd.h>
int lchown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
設置文件的權限,屬於哪個用戶,哪個組,返回0成功,-1失敗。lchown,chow的區別
在於文件為鏈接文件時,lchown設置鏈接文件本身權限,而非鏈接的對象文件
#include <unistd.h>
int access(const char *pathname, int mode);
測試是否可以擁有mode權限訪問文件,返回0表示可以,-1表示不行
mode的權限信息如下:
F_OK 文件存在麼
R_OK 文件可讀麼
W_OK 文件可寫麼
X_OK 文件可執行麼
#include <sys/stat.h>
mode_t umask(mode_t mask);
設置文件的權限掩碼,返回上一次設置的掩碼值。一般可以先保存上一次的
掩碼值,等到必要的時候恢復
include <unistd.h>
int link(const char *oldpath, const char *newpath);
創建一個文件的硬鏈接,返回0成功,-1失敗
#include <unistd.h>
int symlink(const char *filepath, const char *linkpath);
創建一個文件的軟鏈接,返回0成功,-1失敗
#include <unistd.h>
int unlink(const char *pathname);
刪除一個文件的鏈接,如果是文件的最後一個硬鏈接,則刪除文件
返回0成功,-1失敗
注解:如果一個打開的文件被刪除,只能是引用它的所有文件描述符關閉
才會真正的刪除
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
重命名一個文件,返回0成功,-1失敗
nclude <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
創建一個給定權限的文件夾,返回0成功,-1失敗
#include <unistd.h>
int rmdir(const char *pathname);
刪除一個空文件夾,返回0成功,-1失敗;需要注意這個函數
不能刪除有子文件夾,或是含有文件的目錄
#include <stdio.h>
int remove(const char *pathname);
刪除一個文件(unlink),或是一個空文件夾(rmdir),返回0成功,-1失敗
主要是為了實現C標准的庫函數
#include <dirent.h>
DIR *opendir(const char *dirpath);
#include <dirent.h>
DIR *fdopendir(int fd);
打開一個目錄,返回目錄結構,返回NULL表示失敗
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
一個個讀取目錄裡面的內容,返回一個內部的目錄
條目信息,返回NULL表示失敗或者結束
#include <dirent.h>
void rewinddir(DIR *dirp);
重置目錄結構的讀取偏移,指向第一個目錄條目信息
#include <dirent.h>
int closedir(DIR *dirp);
關閉目錄,返回0成功,-1失敗
#include <dirent.h>
int dirfd(DIR *dirp);
得到目錄流的文件描述符,返回0成功,-1失敗
#include <unistd.h>
char *getcwd(char *cwdbuf, size_t size);
獲取當前目錄信息,成功返回cwdbuf,錯誤返回NULL
#include <unistd.h>
int chdir(const char *pathname);
#define _XOPEN_SOURCE 500 /* Or: #define _BSD_SOURCE */
#include <unistd.h>
int fchdir(int fd);
改變當前目錄,成功返回0,-1失敗
#define _BSD_SOURCE
#include <unistd.h>
int chroot(const char *pathname);
改變root目錄,返回0成功,-1失敗
#include <stdlib.h>
char *realpath(const char *pathname, char *resolved_path);
得到軟鏈接的實際文件路徑,resolved_path必須至少是PATH_MAX的大小
#include <libgen.h>
char *dirname(char *pathname);
char *basename(char *pathname);
得到一個路徑的目錄信息或是文件名信息
====監控文件系統====
目前使用inotify相關的API監控文件系統的操作事件
1.使用inotify_init函數創建inotify實例
2.使用inotify_add_watch函數添加需要監控的文件,或是目錄,該函數
返回一個inotify文件描述符
3.從inotify文件描述符中讀取時間進行處理
4.處理完畢後,移除所有的監控對象便可
注解:
a)inotify不是遞歸的,監控目錄,不會監控目錄下的各種子
目錄,或是文件
b)inotify可以使用select(), poll(), epoll()等函數進行IO獲取
監控的事件信息
#include <sys/inotify.h>
int inotify_init(void);
初始化inotify,返回inotify文件描述符,-1表示出錯
#include <sys/inotify.h>
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
添加監控的文件,或是目錄對象,返回監控的文件描述符,-1表示出錯
#include <sys/inotify.h>
int inotify_rm_watch(int fd, uint32_t wd);
刪除監控的對象,返回0成功,-1失敗