st_mode值也包含了針對文件的訪問權限位。所有文件類型(目錄文件、字符特殊文件等)都有訪問權限(access permission)。
每個文件有9個訪問權限位,可將它們分成三類,見表4-5:
表4-5 9個訪問權限位,取自<sys/stat.h>
st_mode屏蔽 | 意義 |
S_IRUSR | 用戶-讀 |
S_IWUSR | 用戶-寫 |
S_IXUSR | 用戶-執行 |
S_IRGRP | 組-讀 |
S_IWGRP | 組-寫 |
S_IXGRP | 組-執行 |
S_IROTH | 其他-讀 |
S_IWOTH | 其他-寫 |
S_IXOTH | 其他-執行 |
在表4-5開頭三行中,術語用戶指的是文件所有者(owner)。chmod(1)命令用于修改這9個權限位。該命令允許我們用u表示用戶(所有者),用g表示組,用o表示其他。
表4-5中的三類訪問權限(即讀、寫及執行)以各種方式由不同的函數使用。我們將這些不同的使用方式匯總如下:
例如,為了打開文件/usr/include/stdio.h,需要對目錄/、/usr和/usr/include具有執行權限。然后,需要具有對該文件本身的適當權限,這取決于以何種模式打開它(只讀、讀-寫等)。
如果當前目錄是/usr/include,那么為了打開文件stdio.h,需要有對該工作目錄的執行權限。這是隱含當前工作目錄的一個實例。打開stdio.h文件與打開./stdio.h作用相同。
注意,對于目錄的讀權限和執行權限的意義是不相同的。讀權限允許我們讀目錄,獲得在該目錄中所有文件名的列表。當一個目錄是我們要訪問文件的路徑名的一個組成部分時,對該目錄的執行權限使得我們可通過該目錄(也就是搜索該目錄,尋找一個特定的文件名)。
引用隱含目錄的另一個例子是,如果PATH環境變量指定了一個我們不具有執行權限的目錄,那么shell絕不會在該目錄下找到可執行文件。
進程每次打開、創建或刪除一個文件時,內核就進行文件訪問權限測試,而這種測試可能涉及文件的所有者(st_uid和st_gid)、進程的有效ID(有效用戶ID和有效組ID)以及進程的附加組ID(若支持的話)。兩個所有者ID是文件的性質,而兩個有效ID和附加組ID則是進程的性質。內核進行的測試是:
(1)若進程的有效用戶ID是0(超級用戶),則允許訪問。這給予了超級用戶對整個文件系統進行處理的最充分的自由。
(2)若進程的有效用戶ID等于文件的所有者ID(也就是該進程擁有此文件),那么:若所有者適當的訪問權限位被設置,則允許訪問,否則拒絕訪問。適當的訪問權限位指的是,若進程為讀而打開該文件,則用戶讀位應為1;若進程為寫而打開該文件,則用戶寫位應為1;若進程將執行該文件,則用戶執行位應為1.
(3)若進程的有效組ID或進程的附加組ID之一等于文件的組ID,那么:若組適當的訪問權限位被設置,則允許訪問,否則拒絕訪問。
(4)若其他用戶適當的訪問權限位被設置,則允許訪問,否則拒絕訪問。
按順序執行這四步。注意,如若進程擁有此文件(第2步),則按用戶訪問權限批準或拒絕該進程對文件的訪問——不查看組訪問權限。類似地,若進程并不擁有該文件,但進程屬于某個適當的組,則按組訪問權限批準或拒絕該進程對文件的訪問——不查看其他用戶的訪問權限。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答