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)

引用自

access(2), acl(5), capabilities(7), chmod(1), euidaccess(3), explain(1), explain(3), explain_chmod(3), explain_chmod_or_die(3), fakeroot-tcp(1), gdbm(3), gfs2_mount(8), gfs_mount(8), hylafax-config(5), lockfile_create(3), logrotate(8), mknod(2), mount.gfs2(8), nfslogsum(8), perlfunc(1), rename(2), rmdir(2), spufs(2), spufs(7), tar_extract_regfile(3), umask(2), xfs_db(8), zfs(8)