04.09 chmod
区别于 umask
的操作只作用于文件的读写执行相关的 9 位,chmod
是字如其名的操作 struct stat
类型 st_mode
字段的系统调用。
chmod
系统调用只会改变文件 inode 结点的上次修改时间,不会改变文件内容的上次修改时间。因此,用 ls
列出 chmod
修改过权限的文件属性时,我们不会看到文件的上次修改时间有变化。
$ ls -lh A.txt
-rw-r----- 1 root root 20 May 8 23:35 A.txt
$ chmod 644 A.txt
$ ls -lh A.txt
-rw-r--r-- 1 root root 20 May 8 23:35 A.txt
chmod
在一些条件下会清除粘着位、设置用户 ID 位和设置组 ID 位。略。
粘着(sticky)位对应 S_ISVTX
(saved-text bit,又叫保存正文位),在尚未使用请求分页的早期 UNIX 版本中,带有粘着位的可执行文件在第一次执行结束之后其代码副本会被保存到交换区,这样下一次就可以被更快被加入到内存中。常用的文本编辑器或者编译器都适合使用粘着位。
现在 Single UNIX Specification 扩展了粘着位的含义:如果一个目录具有粘着位,对该目录具有写权限且满足 a) 拥有此文件 b) 拥有此目录 c) 是超级用户 三个条件中的至少一个才能删除或者重命名目录下的文件。目录 /tmp 和 /var/tmp 就适合设置粘着位,它们都是公用目录,允许所有用户在里面创建文件,但是不希望其他用户删除或者重命名。我的理解是删除和重命名是在修改文件的元信息,而不是修改文件的内容,所以有专门的控制选项。