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)
字元裝置
塊裝置(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來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間
Opencv中Mat結構體中元素的獲取與賦值
【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( )