chmod , fchmod 或 fchmodat 子例程
用途
更改文件系统对象基本文件方式位。
库
标准 C 库 (libc.a)
语法
#include <sys/stat.h>
int chmod (Path, Mode)
const char *Path;
mode_t Mode;
int fchmod (FileDescriptor, Mode)
int FileDescriptor;
mode_t Mode;
int fchmodat (DirFileDescriptor, Path, Mode, Flag)
int DirFileDescriptor;
const char *Path;
mode_t Mode;
int Flag;
描述
chmod 子例程设置由 Path 参数指定的文件的访问许可权。 如果系统上安装了网络文件系统 (NFS) ,那么此路径可以跨入另一个节点。
使用 fchmod 子例程来设置 FileDescriptor 参数指向的打开文件的访问许可权。
如果 FileDescriptor 引用共享内存对象,那么 fchmod 子例程会影响 S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH和 S_IWOTH 文件许可权位。
根据 Mode 参数设置访问控制信息。 请注意,这些例程将替换与文件系统对象关联的任何现有 ACL。
如果 "路径参数指定了绝对路径,或者 "DirFileDescriptor参数设置为 AT_FDCWD,则 "fchmodat子程序等同于 "chmod子程序。 要更改的文件由与DirFileDescriptor参数关联的目录(而不是当前工作目录)的相对路径决定。 如果在没有 O_SEARCH 打开标志的情况下打开目录,那么子例程将检查以确定是否允许使用目录的当前许可权进行目录搜索。 如果使用 O_SEARCH 打开标志打开目录,那么子例程不会执行检查。
参数
| 项 | 描述 |
|---|---|
| FileDescriptor | 指定打开文件或共享内存对象的文件描述符。 |
| 方式 | 指定用于确定访问许可权的位模式。 Mode 参数通过对 sys/mode.h 文件中定义的以下一个或多个值进行逻辑 OR 运算来构造:
以下属性仅适用于直接可执行文件。 当应用于可执行文本文件 (例如 shell 脚本和 awk 脚本) 时,它们没有意义。
存在可以使用 mknod 子例程设置但不能使用 chmod 子例程设置的其他方式值。 |
| 路径 | 指定文件的路径名。 对于fchmodat,如果指定了DirFileDescriptor且 Path 是相对的,那么DirFileDescriptor将指定Path 的有效当前工作目录。 |
| DirFileDescriptor | 指定打开目录的文件描述符,该文件描述符用作 Path 参数的有效当前工作目录。 如果 "DirFileDescriptor等于 "AT_FDCWD,"DirFileDescriptor参数将被忽略,而 "路径参数将指定完整的文件。 |
| 标志 | 指定位字段参数。 如果 Flag 参数包含 AT_SYMLINK_NOFOLLOW 位,并且 Path 参数指定符号链接,那么会更改符号链接的方式。 |
返回值
成功完成后, chmod, fchmod和 fchmodat 子例程将返回值 0。 如果 "chmod、"fchmod或 "fchmodat子程序不成功,则返回值为 "-1,并设置全局变量 "错误以标识错误。
错误代码
chmod 或 fchmodat 子例程不成功,如果下列其中一项为 true ,那么文件许可权保持不变:
| 项 | 描述 |
|---|---|
| ENOTDIR | Path 前缀的组件不是目录。 |
| EACCES | 拒绝对 Path 前缀的组件的搜索许可权。 |
| Efault | Path 参数指向进程的已分配地址空间外部的位置。 |
| ELOOP | 转换 Path 参数时迂到太多符号链接。 |
| ENOENT | 指定的文件不存在。 |
| ENAMETOOLONG | Path 参数的组件超过 255 个字符,或者整个 Path 参数超过 1023 个字符。 |
| 项 | 描述 |
|---|---|
| EBADF | FileDescriptor 参数的值无效。 |
| 项 | 描述 |
|---|---|
| EPERM | 有效用户标识与文件的所有者不匹配,并且进程没有相应的特权。 |
| EROFS | 指定的文件位于只读文件系统上。 |
| EIO | 操作期间发生 I/O 错误。 |
如果在系统上安装了 NFS ,那么如果以下情况成立,那么 chmod 和 fchmod 子例程也可能不成功:
| 项 | 描述 |
|---|---|
| ESTALE | 进程的根目录或当前目录位于已卸载的虚拟文件系统中。 |
| ETIMEDOUT | 连接超时。 |
fchmodat 子例程不成功,如果下列其中一项为真,那么文件许可权保持不变:
| 项 | 描述 |
|---|---|
| EBADF | 路径参数没有指定绝对路径,DirFileDescriptor参数既不是AT_FDCWD,也不是有效的文件描述符。 |
| EINVAL | Flag 参数的值无效。 |
| ENOTDIR | Path参数不是绝对路径,而DirFileDescriptor是文件描述符,但与目录无关。 |
安全性
访问控制: 调用者必须具有 Path 前缀的所有组件的搜索许可权。
如果接收到 EBUSY 错误,请在 Mode 参数中切换 强制锁定 属性,然后重试操作。 不应在属于可信计算库的文件上使用 强制锁定 属性。