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 位

  1. 如果可执行文件具有此位,则在执行时将进程的有效组 ID 设置为可执行文件对应的组 ID。
  2. 如果目录具有此位,那么目录及它的各级子目录下新创建的文件属组都是父目录的组,因为 set-group-id 位是会被子目录继承的。
  3. 如果屏蔽了属组的可执行权限位,那么 set-group-ID 权限位可以用来表示强制文件锁定。

Sticky 位

对应宏 S_ISVTX

早期用来指示可执行文件在第一次运行结束后,将代码留在交换区中,而不是直接清除掉,以加快可执行文件的下次载入,现在已经抛弃了这种用法。

对于目录而言,sticky 位作用是限制删除。特权进程除外,想要删除或者重命名文件,必须拥有文件或者拥有文件的父目录、且对目录有写权限。