日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sturct stat 结构体中 st_mode 的含义

發(fā)布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sturct stat 结构体中 st_mode 的含义 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在<sys/stat.h>中定義的stat結(jié)構(gòu)體內(nèi)容如下:

[cpp]?view plaincopyprint?
  • struct?stat?{??
  • ???????????????dev_t?????st_dev;?????/*?ID?of?device?containing?file?*/??
  • ???????????????ino_t?????st_ino;?????/*?inode?number?*/??
  • ???????????????mode_t????st_mode;????/*?protection?*/??
  • ???????????????nlink_t???st_nlink;???/*?number?of?hard?links?*/??
  • ???????????????uid_t?????st_uid;?????/*?user?ID?of?owner?*/??
  • ???????????????gid_t?????st_gid;?????/*?group?ID?of?owner?*/??
  • ???????????????dev_t?????st_rdev;????/*?device?ID?(if?special?file)?*/??
  • ???????????????off_t?????st_size;????/*?total?size,?in?bytes?*/??
  • ???????????????blksize_t?st_blksize;?/*?blocksize?for?file?system?I/O?*/??
  • ???????????????blkcnt_t??st_blocks;??/*?number?of?512B?blocks?allocated?*/??
  • ???????????????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?*/??
  • ???????????};??
  • 本文著眼于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)容還不錯,歡迎將生活随笔推薦給好友。