1. 程式人生 > >sturct stat 結構體中 st_mode 的含義

sturct stat 結構體中 st_mode 的含義

在<sys/stat.h>中定義的stat結構體內容如下:

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成員,該成員描述了檔案的型別許可權兩個屬性。

st_mode是個32位的整型變數,不過現在的linux作業系統只用了低16位(估計是鑑於以後拓展的考慮)。 

===============================================================================================================

先看File type屬性區域,位於bit12 ~ bit15.

在現代linux作業系統上檔案型別共分為7種,分別是:

普通檔案(regular file)

目錄(directory)

字元裝置

(character device)

塊裝置(block device)

管道(FIFO<pipe>)

符號連結檔案(symbolic link)

套介面檔案(socket)

所以File type屬性只需3bit就夠了,估計也是考慮到了以後的擴充套件問題。
 

在<sys/stat.h>中有如下定義:

#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(注意這裡用的是八進位制), 可以用來過濾出前四位表示的檔案型別。

其後的連續七個分別對應套介面檔案、符號連結檔案、普通檔案、塊裝置、目錄、字元裝置、管道,它們分別對應一個不同的值。

現在假設我們要判斷一個檔案是不是目錄,我們怎麼做呢?

很簡單,首先通過掩碼S_IFMT把其他無關的部分置0,再與表示目錄的數值比較,從而判斷這是否是一個目錄,下面的程式碼:

if ((info.st_mode & S_IFMT) == S_IFDIR)
    printf("this is a directory");


為了簡便操作,<sys/stat.h>中提供了巨集來代替上述程式碼,所以如果需要判斷檔案是不是目錄就可以這樣:

if (S_ISDIR(info.st_mode))
    printf("this is a directory");

===============================================================================================================

接著來看Permission屬性區域的bit0~bit8,也即st_mode欄位的最低9位,代表檔案的許可許可權,它標識了檔案所有者(owner)、組使用者(group)、其他使用者(other)的讀(r)、寫(w)、執行(x)許可權。

在<sys/stat.h>有如下定義:

#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 */

 程式中可以自由組合使用它們。

值得一提的是,目錄的許可權與普通檔案的許可權是不同的。目錄的讀、寫、執行許可權含義分別如下:

(1)讀許可權。讀許可權允許我們通過opendir()函式讀取目錄,進而可以通過readdir()函式獲得目錄內容,即目錄下的檔案列表。

(2)寫許可權。寫許可權代表的是可在目錄內建立、刪除檔案,而不是指的寫目錄本身。

(3)執行許可權。可訪問目錄中的檔案。

===============================================================================================================

最後來看Permission屬性區域的bit9 ~ bit11,這三個bit比較特殊,代表檔案的特殊屬性,分別為set-user-ID位、set-group-ID位和sticky位,下面一一介紹每個位的含義。

相關推薦

sturct stat 結構 st_mode含義

在<sys/stat.h>中定義的stat結構體內容如下: struct stat { dev_t st_dev; /* ID of device containing file */

struct stat結構st_mode引數的含義

這個Sticky Bit當前只針對目錄有效,對檔案沒有效果。SBit對目錄的作用是:“在具有SBit的目錄下,使用者若在該目錄下具有w及x許可權,則當用戶在該目錄下建立檔案或目錄時,只有檔案擁有者與root才有權力刪除”。換句話說:當甲使用者在A目錄下擁有group或other的專案,且擁有w許可權,這表示甲

結構冒號的含義

C99規定int、unsigned int和bool可以作為位域型別,但編譯器幾乎都對此作了擴充套件,允許其它型別型別的存在。 使用位域的主要目的是壓縮儲存,其大致規則為: 1)如果相鄰位域欄位的型別相同,且其位寬之和小於型別的sizeof大小,則後面的字 段將緊鄰前一個

Linux的struct stat 結構stat() 函式

根據下面的連結,直接看使用 struct stat 結構體和 stat() 函式的程式: 對於 struct stat 結構體型別的 buf 變數中的 st_size 的資料型別,根據網上查到的資料,在64位系統下為 long long int 型別,所以我們將該變數進行

13-stat 結構 st_mode 欄位

上一篇我們使用了 stat 函式取得了 test.txt 檔案的相關屬性,這些屬性都儲存在一個叫 struct stat 的結構體中: struct stat { dev_t st_dev; /* 包含這個檔案的裝置 ID

Linux環境task_struct結構的各個欄位的含義

task_struct結構體 欄位介紹 Linux核心通過一個被稱為程序描述符的task_struct結構體來管理程序, task_struct是Linux中的【程序控制塊PCB結構】的具體資料結構 這個結構體包含了一個程序所需的所有資訊。它定義在linu

在C語言結構添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

golang 結構的匿名接口

imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

C語言中free()函數釋放struct結構的規律

void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

OpencvMat結構元素的獲取與賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

C語言結構冒號(位域)用法

位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

結構運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

C++組合(聚合)與C結構包含函式

C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,

結構的指標,用malloc初始化時,沒有分配足夠的記憶體空間,造成下述錯誤

      對結構體中的指標,初始化和釋放,遇到堆損壞問題(附連結點選開啟連結)點選開啟連結) out_defect.texturing = (TEXTURING *)malloc(sizeof(TEXTURING

結構使用函式指標

 struct kobj _ type  {  void (*release)(struct kobject *);  struct sysfs _ ops * sysfs _ ops;  struct attribute ** default _

獲取一個檔案的屬性(struct stat結構)

1 標頭檔案 #include <sys/types.h> #include <sys/stat.h> 2 作用/功能 描述一個linux系統檔案系統中的檔案屬性的結構 3 獲取一個檔案的屬性的兩種方法 (1)通過路徑 int stat(con

C++:對結構字元陣列賦值時,出現表示式必須是可修改的左值的問題

問題描述:         在C++中為結構體中的字元陣列賦值時,出現”表示式必須是可修改的左值“的錯誤提醒,編譯報錯“不可指定資料型別”。           &n

結構定義變數時,出現冒號+數字的形式(位域定義)

該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

PE檔案可選頭結構的校驗和

Windows作業系統中的驅動和一些系統dll檔案都是有校驗和的,而且Windows系統在載入時實惠檢查校驗和有沒有發生變化,發生變化,說明檔案已經被修改過(沒有變化,檔案可能沒有修改過;也可能檔案修改後,重新計算了校驗和,填寫到指定位置)肯定不會繼續載入。CheckSumMappedFile( )