Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示
1.依賴的頭文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
2.函數(shù)定義:
//通過傳入文件路徑,struct stat結(jié)構(gòu)體指針的方式
int stat(const char *path, struct stat *buf);
//通過文件描述符獲取文件對應(yīng)的屬性。文件打開后這樣操作
int fstat(int fd, struct stat *buf);
//通過文件描述符獲取文件對應(yīng)的屬性。文件打開后這樣操作
int lstat(const char *path, struct stat *buf);
說明:執(zhí)行成功返回0,失敗返回-1,錯誤代碼存于errno
注意:
?????????給定一個path
?????????A:stat函數(shù)返回一個與此命名文件有關(guān)的信息結(jié)構(gòu)
?????????B:fstat函數(shù)獲得已在描述符filedes上打開的文件信息
?????????C:lstat函數(shù)類似于stat,但是當(dāng)命名的文件時一個符號連接是,lstat返回該符號連接的有關(guān)信息,而不是由此符號鏈接引用的文件的信息
3.這些函數(shù)的功能是返回關(guān)于一個文件的信息;
???A:stat既有命令也有同名函數(shù),用來獲取文件的Inode里主要信息,stat跟蹤符號鏈接
?? B:lstat不跟蹤符號鏈接
4.stat里面時間辨析
???atime(最近訪問時間)
???mtime(最近更改時間):指最近修改文件內(nèi)容的時間
???ctime(最近改動時間):指最近改動Innode的時間,要注意的是mtime信息是Innode中的一項,所以一旦它修改了,這一項也會修改
5.所有的這些系統(tǒng)調(diào)用后返回一個stat的結(jié)構(gòu)體,這個結(jié)構(gòu)體包括以下內(nèi)容:
struct stat {
?????????????? dev_t???? st_dev;???????? /* ID of device containing file???文件設(shè)備編號*/
?????????????? ino_t???? st_ino;???????????/* inode number??節(jié)點號*/
?????????????? mode_t??? st_mode;??? /* protection??文件的類型和存取的權(quán)限*/
?????????????? nlink_t?? st_nlink;??????? /* number of hard links??連到該文件的硬連接數(shù)目,剛建立的文件值為1*/
?????????????? uid_t???? st_uid;?????????? /* user ID of owner???用戶ID*/
?????????????? gid_t???? st_gid;?????????? /* group ID of owner?組ID*/
?????????????? dev_t???? st_rdev;??????? /* device ID (if special file)??(設(shè)備類型)若此文件尾設(shè)備文件,則為其設(shè)備編號*/
?????????????? off_t???? st_size;????????? /* total size, in bytes??文件字節(jié)數(shù)(文件大小)*/
?????????????? blksize_t st_blksize;? /* blocksize for filesystem I/O???塊大小(文件系統(tǒng)的I/O緩沖區(qū)大小),類型為unsigned long類型*/
?????????????? blkcnt_t? st_blocks;?? /* number of 512B blocks allocated? ,分配的512字節(jié)的塊數(shù),類型為unsigned long類型*/
?????????????? time_t??? st_atime;??? ?/* time of last access?最后一個訪問時間*/
?????????????? time_t??? st_mtime;??? /* time of last modification?最后更改的時間*/
?????????????? time_t??? st_ctime;???? /* time of last status change???inode的更改時間*/
?????????? };
6.通過下面的宏(macros)定義文件類型,下面的st_mode域包括以下幾個部分:
?????????? S_ISREG(m)? is it a regular file?????????????????????????????????????? 是否是一個常規(guī)文件
?????????? S_ISDIR(m)? directory???????????????????????????????????????????????????? 是否是一個目錄
?????????? S_ISCHR(m)? character device?????????????????????????????????????? 是否是一個字符設(shè)備
?????????? S_ISBLK(m)? block device?????????????????????????????????????????????? 是否是一個塊設(shè)備
?????????? S_ISFIFO(m) FIFO (named pipe)????????????????????????????????????是否是輸入輸出(管道)???
?????????? S_ISLNK(m)? symbolic link?? (Not in POSIX.1-1996.)??????是否是符號鏈接
?????????? S_ISSOCK(m) socket?? (Not in POSIX.1-1996.)??????????????是否是socket
7.下面的flags為了這個st_mode域而定義的
?????????? S_IFMT???? 0170000?? bit mask for the file type bit fields???為bit域定義的位元掩碼
?????????? S_IFSOCK?? 0140000?? socket??????????????????????????????????????????socket????????????????????????????????????????????????????????
?????????? S_IFLNK??? 0120000?? symbolic link??????????????????????????????????符號連接
?????????? S_IFREG??? 0100000?? regular file?????????????????????????????????????常規(guī)文件
?????????? S_IFBLK??? 0060000?? block device???????????????????????????????????塊設(shè)備
?????????? S_IFDIR??? 0040000?? directory??????????????????????????????????????????目錄
?????????? S_IFCHR??? 0020000?? character device????????????????????????????字符設(shè)備
?????????? S_IFIFO??? 0010000?? FIFO????????????????????????????????????????????????先進先出
?????????? S_ISUID??? 0004000?? set-user-ID bit?????????????????????????????????文件的(set user-id on execution)位
?????????? S_ISGID??? 0002000?? set-group-ID bit (see below)???????????文件的(set group-id on execution)位
?????????? S_ISVTX??? 0001000?? sticky bit (see below)????????????????????? 文件的sticky為
?????????? S_IRWXU??? 00700???? mask for file owner permissions?????文件擁有者的掩碼
?????????? S_IRUSR??? 00400???? owner has read permission?????????????擁有者有讀權(quán)限
?????????? S_IWUSR??? 00200???? owner has write permission????????????擁有者有寫權(quán)限
?????????? S_IXUSR??? 00100???? owner has execute permission????????擁有者有執(zhí)行權(quán)限
?????????? S_IRWXG??? 00070???? mask for group permissions???????????組權(quán)限的掩碼??????????
?????????? S_IRGRP??? 00040???? group has read permission?????????????組有讀權(quán)限
?????????? S_IWGRP??? 00020???? group has write permission????????????組有些權(quán)限
?????????? S_IXGRP??? 00010???? group has execute permission????????組有執(zhí)行權(quán)限
?????????? S_IRWXO??? 00007???? mask for permissions for others (not in group)??????其它者(不在組中)的權(quán)限掩碼
?????????? S_IROTH??? 00004???? others have read permission??????????????????????????????????其它者有讀權(quán)限
?????????? S_IWOTH??? 00002???? others have write permission???????????????????????????????? 其它者有寫權(quán)限
?????????? S_IXOTH??? 00001???? others have execute permission?????????????????????????????其它者有執(zhí)行權(quán)限
8.關(guān)于黏住位
??????????若一個目錄具有sticky位(S_ISVTX)?則表示在此目錄下的文件只能被文件所有者,次目錄的所有者或者root來刪除或修改
9.此外
struct statfs {
??? long??? f_type;?????????? //文件系統(tǒng)類型
??? long??? f_bsize;?????????//塊大小
??? long??? f_blocks;???????//塊多少
??? long??? f_bfree;???????? //空閑的塊
??? long??? f_bavail;??????? //可用塊
??? long??? f_files;?????????? //總文件節(jié)點
??? long??? f_ffree;????????? //空閑文件節(jié)點
??? fsid_t f_fsid;???????????? //文件系統(tǒng)id
??? long??? f_namelen;??? //文件名的最大長度
??? long??? f_spare[6];?????//spare for later
};
10.stat()函數(shù)調(diào)用案例(通過程序的方式調(diào)用stat(),并且呈現(xiàn)?stat?結(jié)構(gòu)體中的信息 )
運行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 世界上最奇葩的生日蛋糕怎么买?
- 下一篇: 孜然羊肉家常做法?