在介绍用于描述文件信息的结构体 stat
的时候,其成员 st_mode
值指定了属主对文件的存取许可权。所有类型的文件(目录、字符设备文件等)都有存取许可权,而不只是普通文件。每个文件都对应九种存取许可权,可将他们分为三类,如下所示:
st_mode | 意义说明 |
S_IRUSR |
所属用户可读 |
S_IWUSR |
所属用户可写 |
S_IXUSR |
所属用户可执行 |
S_IRGRP |
与所属用户同组的其他用户可读 |
S_IWGRP |
与所属用户同组的其他用户可写 |
S_IXGRP |
与所属用户同组的其他用户可执行 |
S_IROTH |
其他用户可读 |
S_IWOTH |
其他用户可写 |
S_IXOTH |
其他用户可执行 |
上述表格中的宏在 <sys/stat.h>
中的定义如下所示:
#define S_IRUSR __S_IREAD /* Read by owner. */ #define S_IWUSR __S_IWRITE /* Write by owner. */ #define S_IXUSR __S_IEXEC /* Execute by owner. */ /* Read, write, and execute by owner. */ #define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC) #define S_IRGRP (S_IRUSR >> 3) /* Read by group. */ #define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ #define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */ /* Read, write, and execute by group. */ #define S_IRWXG (S_IRWXU >> 3) #define S_IROTH (S_IRGRP >> 3) /* Read by others. */ #define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ #define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */ /* Read, write, and execute by others. */ #define S_IRWXO (S_IRWXG >> 3)点击复制复制失败已复制
提示
<sys/stat.h>
的具体位置在Ubuntu 20.04
中为:/usr/include/x86_64-linux-gnu/sys/stat.h
S_IRWXU
、S_IRWXG
和S_IRWXO
为三种权限均具有的宏。
继续追踪,上述宏的原型在<bits/stat.h>
中定义如下所示:
#define __S_IREAD 0400 /* Read by owner. */ #define __S_IWRITE 0200 /* Write by owner. */ #define __S_IEXEC 0100 /* Execute by owner. */点击复制复制失败已复制
提示
<bits/stat.h>
的具体位置在 Ubuntu 20.04
中为: /usr/include/x86_64-linux-gnu/bits/stat.h
由此可以分析得出,用于表示文件权限的宏其实是八进制数,因此,如果需要定义文件的存取权限,可以采用位运算的方式进行转换,如下所示:
#define I_SRWXU S_IRUSR|S_IWUSR|S_IXUSR点击复制复制失败已复制
宏I_SRWXU
表示用户对文件拥有可读、可写、可执行的权限,用户指的是文件所有者。如同在Windows
操作系统中,管理员就是一个特殊的用户,拥有至高的权限。
进一步讨论,要打开任一类型的文件,对该名字包含的每一个目录,包括它可能隐含的当前目录,都应具有执行许可权,例如,为了打开文件/usr/include/stdio.h
,需要具有对目录/usr/include
的执行许可权,以及对文件本身的适当许可权。
注意
对于目录来说,读许可权和执行许可权的意义不相同。读许可权允许读目录,获得该目录中所有文件名的列表。要在一个目录中创建一个新文件,必须对该目录具有写许可权和执行许可权。同样,删除一个文件,需要对目录具有写许可权和执行许可权,而不涉及对文件本身的许可权。