15.04 st_mode 组成和每一位的解释
st_mode
的组成
st_mode
在 inode(7) 手册中的说明是 file type and mode,其组成是:文件类型 4 位 + 特殊 3 位 + 权限 9 位。
高 4 位是用来表示文件类型的(以下内容出自 man 7 inode
),目前是有 7 种类型:
// 8 进制
S_IFMT 0170000 bit mask for the file type bit field
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
stat
结构中 st_mode
字段的低 12 位定义了文件权限。其中的前 3 位为专用位,分别是 set-user-ID 位、set-group-ID 位和 sticky 位(粘着位)。后面的 9 位分别是用户、组、其他的 rwx 权限。
Set-user-ID 位
如果可执行文件具有此位,则在执行时将进程的有效用户 ID 设置为可执行文件对应的用户 ID。
Set-group-ID 位
- 如果可执行文件具有此位,则在执行时将进程的有效组 ID 设置为可执行文件对应的组 ID。
- 如果目录具有此位,那么目录及它的各级子目录下新创建的文件属组都是父目录的组,因为 set-group-id 位是会被子目录继承的。
- 如果屏蔽了属组的可执行权限位,那么 set-group-ID 权限位可以用来表示强制文件锁定。
Sticky 位
对应宏 S_ISVTX
。
早期用来指示可执行文件在第一次运行结束后,将代码留在交换区中,而不是直接清除掉,以加快可执行文件的下次载入,现在已经抛弃了这种用法。
对于目录而言,sticky 位作用是限制删除。特权进程除外,想要删除或者重命名文件,必须拥有文件或者拥有文件的父目录、且对目录有写权限。