chmod , fchmod 或 fchmodat 子例程

用途

更改文件系统对象基本文件方式位。

标准 C 库 (libc.a)

语法

#include <sys/stat.h>
int chmod (Path Mode)
const char *Path;
mode_t Mode;
int fchmod (FileDescriptorMode)
int FileDescriptor;
mode_t Mode;
int fchmodat (DirFileDescriptorPathMode, Flag)
int DirFileDescriptor;
const char *Path;
mode_t Mode;
int  Flag;

描述

chmod 子例程设置由 Path 参数指定的文件的访问许可权。 如果系统上安装了网络文件系统 (NFS) ,那么此路径可以跨入另一个节点。

使用 fchmod 子例程来设置 FileDescriptor 参数指向的打开文件的访问许可权。

如果 FileDescriptor 引用共享内存对象,那么 fchmod 子例程会影响 S_IRUSRS_IWUSRS_IRGRPS_IWGRPS_IROTHS_IWOTH 文件许可权位。

根据 Mode 参数设置访问控制信息。 请注意,这些例程将替换与文件系统对象关联的任何现有 ACL。

如果 "路径参数指定了绝对路径,或者 "DirFileDescriptor参数设置为 AT_FDCWD,则 "fchmodat子程序等同于 "chmod子程序。 要更改的文件由与DirFileDescriptor参数关联的目录(而不是当前工作目录)的相对路径决定。 如果在没有 O_SEARCH 打开标志的情况下打开目录,那么子例程将检查以确定是否允许使用目录的当前许可权进行目录搜索。 如果使用 O_SEARCH 打开标志打开目录,那么子例程不会执行检查。

参数

描述
FileDescriptor 指定打开文件或共享内存对象的文件描述符。
方式 指定用于确定访问许可权的位模式。 Mode 参数通过对 sys/mode.h 文件中定义的以下一个或多个值进行逻辑 OR 运算来构造:
S_ISUID
对可执行文件启用 setuid 属性。 执行此程序的进程获取文件所有者的访问权。
S_ISGID
对可执行文件启用 setgid 属性。 执行此程序的进程获取文件组的访问权。 此外,启用目录的组继承属性。 在此目录中创建的文件具有等于该目录的组的组。

以下属性仅适用于直接可执行文件。 当应用于可执行文本文件 (例如 shell 脚本和 awk 脚本) 时,它们没有意义。

S_ISVTX
对目录启用 link/unlink 属性。 无法在此目录中链接到文件。 仅当请求进程对目录具有写许可权并且是文件或目录的所有者时,才能取消链接文件。
S_ISVTX
对可执行文件启用 save text 属性。 使用后未取消映射程序。 此属性只能由 root 用户启用。 当由其他任何人指定时,将忽略此属性。
S_ENFMT
对常规文件启用强制方式记录锁定。 使用 lockf 子例程请求的文件锁定被强制实施。
S_IRUSR
允许文件的所有者读取该文件。
S_IWUSR
允许文件的所有者对其进行写入。
S_IXUSR
允许文件所有者执行该文件 (或搜索目录)。
S_IRGRP
允许该文件的组读取该文件。
S_IWGRP
允许该文件的组写入该文件。
S_IXGRP
允许文件组执行该文件 (或搜索目录)。
S_IROTH
允许其他人读取文件。
S_IWOTH
允许其他人写入文件。
S_IXOTH
允许其他用户执行文件 (或搜索目录)。

存在可以使用 mknod 子例程设置但不能使用 chmod 子例程设置的其他方式值。

路径 指定文件的路径名。 对于fchmodat,如果指定了DirFileDescriptor且 Path 是相对的,那么DirFileDescriptor将指定Path 的有效当前工作目录。
DirFileDescriptor 指定打开目录的文件描述符,该文件描述符用作 Path 参数的有效当前工作目录。 如果 "DirFileDescriptor等于 "AT_FDCWD,"DirFileDescriptor参数将被忽略,而 "路径参数将指定完整的文件。
标志 指定位字段参数。 如果 Flag 参数包含 AT_SYMLINK_NOFOLLOW 位,并且 Path 参数指定符号链接,那么会更改符号链接的方式。

返回值

成功完成后, chmodfchmodfchmodat 子例程将返回值 0。 如果 "chmod、"fchmod或 "fchmodat子程序不成功,则返回值为 "-1,并设置全局变量 "错误以标识错误。

错误代码

chmodfchmodat 子例程不成功,如果下列其中一项为 true ,那么文件许可权保持不变:

描述
ENOTDIR Path 前缀的组件不是目录。
EACCES 拒绝对 Path 前缀的组件的搜索许可权。
Efault Path 参数指向进程的已分配地址空间外部的位置。
ELOOP 转换 Path 参数时迂到太多符号链接。
ENOENT 指定的文件不存在。
ENAMETOOLONG Path 参数的组件超过 255 个字符,或者整个 Path 参数超过 1023 个字符。
fchmod 子例程不成功,如果以下情况成立,那么文件许可权保持不变:
描述
EBADF FileDescriptor 参数的值无效。
   
chmodfchmodfchmodat 子例程不成功,如果下列其中一项为 true ,那么文件的访问控制信息保持不变:
描述
EPERM 有效用户标识与文件的所有者不匹配,并且进程没有相应的特权。
EROFS 指定的文件位于只读文件系统上。
EIO 操作期间发生 I/O 错误。

如果在系统上安装了 NFS ,那么如果以下情况成立,那么 chmodfchmod 子例程也可能不成功:

描述
ESTALE 进程的根目录或当前目录位于已卸载的虚拟文件系统中。
ETIMEDOUT 连接超时。

fchmodat 子例程不成功,如果下列其中一项为真,那么文件许可权保持不变:

描述
EBADF 路径参数没有指定绝对路径,DirFileDescriptor参数既不是AT_FDCWD,也不是有效的文件描述符。
EINVAL Flag 参数的值无效。
ENOTDIR Path参数不是绝对路径,而DirFileDescriptor是文件描述符,但与目录无关。

安全性

访问控制: 调用者必须具有 Path 前缀的所有组件的搜索许可权。

如果接收到 EBUSY 错误,请在 Mode 参数中切换 强制锁定 属性,然后重试操作。 不应在属于可信计算库的文件上使用 强制锁定 属性。