04.08 umask 设置屏蔽字

umask 系统调用

这样理解屏蔽字:当某一位被设置为 1,这一位就不起作用。umask 把当前进程的文件创建屏蔽字设置为 mask & 0777,也就是只有文件权限位是受到屏蔽的。umask 能影响 openmkdir 等系统调用,这相当于每次传入它们的 mode_t 参数都用 umask 屏蔽了给定的位。

Tip

  • 文件打开标志中int flags),读、写、读写三个状态被设置成了互斥的,读和写不能简单叠加得到读写。它们的宏以 O_ 开头(可能表示 open),分别是 O_RDONLY / O_WRONLY / O_RDWR,访问前要先用 O_ACCMODE 掩码对 flags 做好处理。
  • 文件访问权限模式mode_t mode)读、写、执行可以叠加。它们的宏以 S_I 开头(可能表示 stat、inode),然后跟 R/W/X 中的一个,再跟 USR/GRP/OTH 中的一个。

Tip

掩码和屏蔽字好像都是 mask。前者的用法是 x & mask,后者的用法是 x & ~mask

默认的 umask 值是 S_IWGRP | S_IWOTH,也就是 022,这表示如果无其他修改,我们无法简单地创建 group 和 others 可以写入的文件。

当文件父目录被设置了 ACL 时,umask 被忽略。

umask 命令

Single UNIX Specification 规定 shell 有 umask 命令。umask 可以用来显示或设置当前的 shell 的 umask。

umask 默认显示模式是数字,这和我们传入 mode 很像。但是 umask 的符号模式(-S)显示的内容形如 u=rwx,g=rx,o=rx,看上去是和我们设置的屏蔽字反着的,意义变成了掩码。