- 论坛徽章:
- 0
|
st_mode值也包含了对文件的存取许可权位。当提及文件时,指的是前面所提到的任何类型的文件。所有文件类型(目录,字符特别文件等)都有存取许可权
每个文件有9个存取许可权位,可将它们分成三类,见表4-4。
t_mode
屏蔽意义
S_IRUSR
用户-读
S_IWUSR
用户-写
S_IXUSR
用户-执行
S_IRGRP
组-读
S_IWGRP
组-写
S_IXGRP
组-执行
S_IROTH
其他-读
S_IWOTH
其他-写
S_IXOTH
其他-执行
表4-4
在表4-4开头三行中,术语用户指的是文件所有者。chmod(1)命令用于修改这9个许可权位。该命令允许我们用u表示用户(所有者),用g表示组,用o表示其他。
图中的三类存取许可权——读、写及执行——以各种方式由不同的函数使用。
第一个规则是,我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行许可权。这就是为什么对于目录其执行许可权位常被称为搜索位的原因。
例如,为了打开文件/usr/dict/words,需要具有对目录/,/usr,/usr/dict的执行许可权。然后,需要对该文件本身的适当许可权,这取决于以何种方式打开它(只读,读-写等)。
如果当前目录是/usr/dict,那么为了打开文件words,需要有对该目录的执行许可。如在指定打开文件words时,可以隐含当前目录,而不用显式地提及/usr/dict,也可使用./words。
注意,对于目录的读许可权和执行许可权的意义不相同。读许可权允许我们读目录,获得在该目录中所有文件名的列表。当一个目录是我们要存取文件的路径名的一个分量时,对该目录的执行许可权使我们可通过该目录(也就是搜索该目录,寻找一个特定的文件名)。
引用隐含目录的另一个例子是,如果PATH环境变量指定了一个我们不具有执行许可权的目录,那么shell决不会在该目录下找到可执行文件。
对于一个文件的读许可权决定了我们是否能够打开该文件进行读操作。这对应于open函
数的O_RDONLY和O_RDWR标志。
对于一个文件的写许可权决定了我们是否能够打开该文件进行写操作。这对应于open函
数的O_WRONLY和O_RDWR标志。
为了在open函数中对一个文件指定O_TRUNC标志,必须对该文件具有写许可权。
为了在一个目录中创建一个新文件,必须对该目录具有写许可权和执行许可权。
为了删除一个文件,必须对包含该文件的目录具有写许可权和执行许可权。对该文件本
身则不需要有读、写许可权。
如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行许可权。
进程每次打开、创建或删除一个文件时,内核就进行文件存取许可权测试,而这种测试可能涉及文件的所有者(st_uid和st_gid),进程的有效ID(有效用户ID和有效组ID)以及进程的添加组ID(若支持的话)。两个所有者ID是文件的性质,而有效ID和添加组ID则是进程的性质。内核进行的测试是:
(1)若进程的有效用户ID是0(超级用户),则允许存取。这给予了超级用户对文件系统进行处理的最充分的自由。
(2)若进程的有效用户ID等于文件的所有者ID(也就是该进程拥有此文件):
(a)若适当的所有者存取许可权位被设置,则允许存取。
(b)否则拒绝存取。
适当的存取许可权位指的是,若进程为读而打开该文件,则用户-读位应为1;若进程为写而打开该文件,则用户-写位应为1;若进程将执行该文件,则用户-执行位应为1。
(3)若进程的有效组ID或进程的添加组ID之一等于文件的组ID:
(a)若适当的组存取许可权位被设置,则允许存取。
(b)否则拒绝存取。
(4)若适当的其他用户存取许可权位被设置,则允许存取,否则拒绝存取。
按顺序执行这四步。注意,如若进程拥有此文件(第(2)步),则按用户存取许可权批准或拒绝该进程对文件的存取——不查看组存取许可权。相类似,若进程并不拥有该文件。但进程属于某个适当的组,则按组存取许可权批准或拒绝该进程对文件的存取——不查看其他用户的存取许可权。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/34065/showart_286580.html |
|