chown() - Unix,Linux 系统调用
广告
名称
chown、fchown、lchown - 更改文件的所有者
语法
#include <sys/types.h>
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
|
描述
这些系统调用更改由path或fd指定的文件的所有者和组。只有特权进程(Linux:具有CAP_CHOWN功能的进程)可以更改文件的所有者。文件的所有者可以将其文件组更改为该所有者所属的任何组。特权进程(Linux:具有CAP_CHOWN)可以任意更改组。
如果owner或group指定为-1,则该ID不会更改。
当可执行文件的所有者或组由非超级用户更改时,S_ISUID和S_ISGID模式位将被清除。POSIX未指定当root执行chown()时是否也应发生这种情况;Linux的行为取决于内核版本。对于非组可执行文件(S_IXGRP位已清除),S_ISGID位表示强制锁定,并且不会被chown()清除。
返回值
成功时,返回零。出错时,返回-1,并且errno被适当地设置。
错误
根据文件系统,可以返回其他错误。下面列出了chown()的更常见错误。
标签 | 描述 |
EACCES | 路径前缀的组件被拒绝搜索权限。(另请参见path_resolution(2)。) |
EFAULT |
path指向您可访问的地址空间之外。 |
ELOOP | 在解析path时遇到太多符号链接。 |
ENAMETOOLONG |
path太长。 |
ENOENT | 文件不存在。 |
ENOMEM | 内核内存不足。 |
ENOTDIR | 路径前缀的组件不是目录。 |
EPERM | 调用进程没有更改所有者和/或组所需的权限(见上文)。 |
EROFS | 命名文件位于只读文件系统上。 |
下面列出了fchown()的常见错误 |
EBADF | 描述符无效。 |
EIO | 修改inode时发生低级I/O错误。 |
ENOENT | 见上文。 |
EPERM | 见上文。 |
EROFS | 见上文。 |
备注
在 2.1.81 之前的 Linux 版本中(与 2.1.46 不同),chown() 不跟踪符号链接。从 Linux 2.1.81 开始,chown() 跟踪符号链接,并且有一个新的系统调用lchown() 不跟踪符号链接。从 Linux 2.1.86 开始,这个新调用(与旧的chown()具有相同的语义)获得了相同的系统调用号,而chown()获得了新引入的编号。
只有在定义_BSD_SOURCE时,fchown() 的原型才可用。
符合标准
4.4BSD、SVr4、POSIX.1-2001。
4.4BSD 版本只能由超级用户使用(即,普通用户不能放弃文件)。
限制
在启用了 UID 映射的 NFS 文件系统上,有意违反了chown() 的语义。此外,访问文件内容的所有系统调用的语义都被违反,因为chown() 可能会导致对已打开文件的立即访问撤销。客户端缓存可能会导致所有权更改以允许用户访问的时间与其他客户端上的用户实际可以访问文件的时间之间存在延迟。
参见
广告
|