生活随笔
收集整理的這篇文章主要介紹了
sturct stat 结构体中 st_mode 的含义
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在<sys/stat.h>中定義的stat結(jié)構(gòu)體內(nèi)容如下:
[cpp]?view plaincopyprint?
struct?stat?{?? ???????????????dev_t?????st_dev;??????? ???????????????ino_t?????st_ino;??????? ???????????????mode_t????st_mode;?????? ???????????????nlink_t???st_nlink;????? ???????????????uid_t?????st_uid;??????? ???????????????gid_t?????st_gid;??????? ???????????????dev_t?????st_rdev;?????? ???????????????off_t?????st_size;?????? ???????????????blksize_t?st_blksize;??? ???????????????blkcnt_t??st_blocks;???? ???????????????time_t????st_atime;????? ???????????????time_t????st_mtime;????? ???????????????time_t????st_ctime;????? ???????????};??
本文著眼于st_mode成員,該成員描述了文件的類型和權(quán)限兩個屬性。
st_mode是個32位的整型變量,不過現(xiàn)在的linux操作系統(tǒng)只用了低16位(估計是鑒于以后拓展的考慮)。?
===============================================================================================================
先看File type屬性區(qū)域,位于bit12 ~ bit15.
在現(xiàn)代linux操作系統(tǒng)上文件類型共分為7種,分別是:
普通文件(regular file)
目錄(directory)
字符設(shè)備(character device)
塊設(shè)備(block device)
管道(FIFO<pipe>)
符號鏈接文件(symbolic link)
套接口文件(socket)
所以File type屬性只需3bit就夠了,估計也是考慮到了以后的擴展問題。
?
在<sys/stat.h>中有如下定義:
[cpp]?view plaincopyprint?
#define?S_IFMT??00170000?? #define?S_IFSOCK?0140000?? #define?S_IFLNK??0120000?? #define?S_IFREG??0100000?? #define?S_IFBLK??0060000?? #define?S_IFDIR??0040000?? #define?S_IFCHR??0020000?? #define?S_IFIFO??0010000?? #define?S_ISUID??0004000?? #define?S_ISGID??0002000?? #define?S_ISVTX??0001000?? ?? #define?S_ISLNK(m)??????(((m)?&?S_IFMT)?==?S_IFLNK)?? #define?S_ISREG(m)??????(((m)?&?S_IFMT)?==?S_IFREG)?? #define?S_ISDIR(m)??????(((m)?&?S_IFMT)?==?S_IFDIR)?? #define?S_ISCHR(m)??????(((m)?&?S_IFMT)?==?S_IFCHR)?? #define?S_ISBLK(m)??????(((m)?&?S_IFMT)?==?S_IFBLK)?? #define?S_ISFIFO(m)?????(((m)?&?S_IFMT)?==?S_IFIFO)?? #define?S_ISSOCK(m)?????(((m)?&?S_IFMT)?==?S_IFSOCK)??
首先S_IFMT是一個掩碼,它的值是017000(注意這里用的是八進制), 可以用來過濾出前四位表示的文件類型。
其后的連續(xù)七個分別對應(yīng)套接口文件、符號鏈接文件、普通文件、塊設(shè)備、目錄、字符設(shè)備、管道,它們分別對應(yīng)一個不同的值。
現(xiàn)在假設(shè)我們要判斷一個文件是不是目錄,我們怎么做呢?
很簡單,首先通過掩碼S_IFMT把其他無關(guān)的部分置0,再與表示目錄的數(shù)值比較,從而判斷這是否是一個目錄,下面的代碼:
[cpp]?view plaincopyprint?
if?((info.st_mode?&?S_IFMT)?==?S_IFDIR)?? ????printf("this?is?a?directory");??
為了簡便操作,<sys/stat.h>中提供了宏來代替上述代碼,所以如果需要判斷文件是不是目錄就可以這樣:
[cpp]?view plaincopyprint?
if?(S_ISDIR(info.st_mode))?? ????printf("this?is?a?directory");??
===============================================================================================================
?
接著來看Permission屬性區(qū)域的bit0~bit8,也即st_mode字段的最低9位,代表文件的許可權(quán)限,它標識了文件所有者(owner)、組用戶(group)、其他用戶(other)的讀(r)、寫(w)、執(zhí)行(x)權(quán)限。
在<sys/stat.h>有如下定義:
[cpp]?view plaincopyprint?
#define?S_IRWXU?00700???/*?mask?for?file?owner?permissions?*/?? #define?S_IRUSR?00400???/*?owner?has?read?permission?*/?? #define?S_IWUSR?00200???/*?owner?has?write?permission?*/?? #define?S_IXUSR?00100???/*?owner?has?execute?permission?*/?? ?? #define?S_IRWXG?00070???/*?mask?for?group?permissions?*/?? #define?S_IRGRP?00040???/*?group?has?read?permission?*/?? #define?S_IWGRP?00020???/*?group?has?write?permission?*/?? #define?S_IXGRP?00010???/*?group?has?execute?permission?*/?? ?? #define?S_IRWXO?00007???/*?mask?for?permissions?for?others?(not?in?group)?*/?? #define?S_IROTH?00004???/*?others?have?read?permission?*/?? #define?S_IWOTH?00002???/*?others?have?write?permission?*/?? #define?S_IXOTH?00001???/*?others?have?execute?permission?*/??
?程序中可以自由組合使用它們。===============================================================================================================
?
最后來看Permission屬性區(qū)域的bit9 ~ bit11,這三個bit比較特殊,代表文件的特殊屬性,分別為set-user-ID位、set-group-ID位和sticky位,下面一一介紹每個位的含義。
總結(jié)
以上是生活随笔為你收集整理的sturct stat 结构体中 st_mode 的含义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。