chmod(2) - Linux 手册页
名称
chmod, fchmod - 更改文件权限
概要
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
glibc 的功能测试宏要求(参见 feature_test_macros(7))
- fchmod():
- _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* 自 glibc 2.12 起: */ _POSIX_C_SOURCE >= 200809L
描述
这些系统调用更改文件的权限。它们唯一的区别在于文件指定方式的不同
- *
chmod() 更改指定路径名 path 的文件的权限,如果它是一个符号链接,则会取消引用该链接。
*
fchmod() 更改由打开的文件描述符 fd 指向的文件的权限。
- 新的文件权限在 mode 中指定,这是一个通过将以下零个或多个标志进行或运算而创建的位掩码
- S_ISUID (04000)
设置用户 ID (在 execve(2) 上设置进程有效用户 ID)
S_ISGID (02000)
设置组 ID (在 execve(2) 上设置进程有效组 ID;强制锁定,如 fcntl(2) 中所述;从父目录获取新文件的组,如 chown(2) 和 mkdir(2) 中所述)
S_ISVTX (01000)
粘滞位 (限制删除标志,如 unlink(2) 中所述)
S_IRUSR (00400)
所有者可读
S_IWUSR (00200)
所有者可写
S_IXUSR (00100)
所有者可执行/搜索(“搜索”适用于目录,意味着可以访问目录中的条目)
S_IRGRP (00040)
组可读
S_IWGRP (00020)
组可写
S_IXGRP (00010)
组可执行/搜索
S_IROTH (00004)
其他用户可读
S_IWOTH (00002)
其他用户可写
S_IXOTH (00001)
其他用户可执行/搜索
- 调用进程的有效 UID 必须与文件的所有者匹配,或者进程必须具有特权 (Linux: 必须具有 CAP_FOWNER 功能)。
如果调用进程没有特权 (Linux: 没有 CAP_FSETID 功能),并且文件的组与进程的有效组 ID 或其辅助组 ID 中的一个不匹配,则 S_ISGID 位将被关闭,但这不会导致返回错误。
作为一项安全措施,根据文件系统,如果文件被写入,设置用户 ID 和设置组 ID 的执行位可能会被关闭。(在 Linux 上,如果写入进程没有 CAP_FSETID 功能,则会发生这种情况。)在某些文件系统上,只有超级用户可以设置粘滞位,粘滞位可能具有特殊含义。有关粘滞位,以及目录上的设置用户 ID 和设置组 ID 位,请参阅 stat(2)。
在 NFS 文件系统上,限制权限会立即影响已经打开的文件,因为访问控制是在服务器上完成的,但打开的文件由客户端维护。如果客户端启用了属性缓存,则扩大权限可能会延迟对其他客户端生效。
返回值
成功时返回零。出错时返回 -1,并相应地设置 errno。
错误
根据文件系统,可能会返回其他错误。chmod() 的更一般的错误如下所示
- EACCES
拒绝访问路径前缀的某个组件的搜索权限。(另请参阅 path_resolution(7)。)
EFAULT
path 指向您可访问地址空间之外的位置。
EIO
发生了 I/O 错误。
ELOOP
在解析 path 时遇到了过多的符号链接。
- ENAMETOOLONG
- path 太长。
- ENOENT
文件不存在。
ENOMEM
内核内存不足。
- ENOTDIR
- 路径前缀的某个组件不是目录。
- EPERM
有效的 UID 与文件的所有者不匹配,并且该进程没有特权 (Linux: 它没有 CAP_FOWNER 功能)。
EROFS
指定的 文件位于只读文件系统上。
- fchmod() 的一般错误如下所示
- EBADF
文件描述符 fd 无效。
EIO
见上文。
EPERM
见上文。
EROFS
见上文。
符合
4.4BSD, SVr4, POSIX.1-2001。
参见
chown(2), execve(2), fchmodat(2), open(2), stat(2), path_resolution(7)