chown() - Unix,Linux系统调用
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix有用参考
  Unix有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于TP  

chown() - Unix,Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

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);

描述

这些系统调用更改由pathfd指定的文件的所有者和组。只有特权进程(Linux:具有CAP_CHOWN能力的进程)才能更改文件的所有者。文件的所有者可以将文件的组更改为该所有者所属的任何组。特权进程(Linux:具有CAP_CHOWN)可以任意更改组。

如果ownergroup指定为-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(以及与2.1.46不同的)版本的Linux中,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()可能会导致对已打开文件的立即访问撤销。客户端缓存可能会导致所有权更改以允许用户访问的时间与用户实际上可以在其他客户端访问文件的时间之间存在延迟。

参见



previous next Printer Friendly

广告


  

广告



广告