天天看點

Linux下函數stat/fstat/lstat的差別

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *path,struct stat *buf);

功能:用來擷取檔案屬性
path:需要檔案路徑
buf:用于存放擷取的檔案屬性
傳回值:成功傳回0,失敗傳回-1
           

int fstat(int fd, struct stat *buf);

功能:根據檔案描述符擷取檔案屬性
fd:需要打開後的檔案描述符
buf:用于存放擷取的檔案屬性
傳回值:成功傳回0,失敗傳回-1
           

int lstat(const char *path, struct stat *buf);

功能:根據檔案路徑擷取檔案屬性
path:檔案路徑
buf:存放擷取的檔案屬性
傳回值:成功傳回0,失敗傳回-1
注意:stat/fstat會跟蹤連結目标,而lstat不跟蹤連結目标
           

struct stat

{
           dev_t     st_dev;    	//裝置id
           ino_t     st_ino;      	//節點号
           mode_t    st_mode;    	//檔案類型和權限
           nlink_t   st_nlink;   	//硬連結數
           uid_t     st_uid;      	//使用者id
           gid_t     st_gid;     	//組id
           dev_t     st_rdev;    	//特殊裝置id
           off_t     st_size;    	//檔案的總位元組數
           blksize_t st_blksize;  	//IO塊數
           blkcnt_t  st_blocks;  	//占用塊(512位元組)數
           time_t    st_atime;  	//最後通路時間
           time_t    st_mtime;   	//最後修改時間
           time_t    st_ctime;   	//最後檔案屬性修改時間
};
           

根據檔案屬性中的st_mode,調用下列宏函數可判斷檔案類型

S_ISREG(m)  	//是否是标準檔案
S_ISDIR(m)   	//目錄
S_ISCHR(m)   	//字元裝置檔案
S_ISBLK(m)   	//塊裝置檔案
S_ISFIFO(m)	//管道裝置檔案
S_ISLNK(m)  	//連結檔案
S_ISSOCK(m) 	//socket檔案 
           

繼續閱讀