版权所有 © 2014 tutorialspoint
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);
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()的更常见错误。
在 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() 可能会导致对已打开文件的立即访问撤销。客户端缓存可能会导致所有权更改以允许用户访问的时间与文件实际上可以被其他客户端上的用户访问的时间之间存在延迟。
chmod (2)
fchownat (2)
flock (2)
path_resolution (2)
广告