函数chown、fchown、fchownat和lchown

来源:互联网 发布:mac不允许写访问 编辑:程序博客网 时间:2024/06/05 17:35

下面几个chown函数可用于更改文件的用户ID和组ID。如果两个参数owner或group中的任意一个是-1,则对应的ID不变。
 

  1. #include <unistd.h>    
  2.  
  3. int chown(const char *pathname, uid_t owner, gid_t group);    
  4.  
  5. int fchown(int fd, uid_t owner, gid_t group);     
  6.  
  7. int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);     
  8.  
  9. int lchown(const char *pathname, uid_t owner, gid_t group);     
  10.  
  11. 4个函数的返回值:若成功,返回0;若出错,返回-1 

除了所引用的文件是符号链接以外,这4个函数的操作类似。在符号链接情况下,lchown和fchownat(设置了AT_SYMLINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。

fchown函数改变fd参数指向的打开文件的所有者,既然它在一个已打开的文件上操作,就不能用于改变符号链接的所有者。

fchownat函数与chown或者lchown函数在下面两种情况下是相同的:一种是pathname参数为绝对路径,另一种是fd参数取值为AT_FDCWD而pathname参数为相对路径。在这两种情况下,如果flag参数中设置了AT_SYMLINK_NOFOLLOW标志,fchownat与lchown行为相同,如果flag参数中清除了AT_SYMLINK_NOFOLLOW标志,则fchownat与chown行为相同。 如果fd参数设置为打开目录的文件描述符,并且pathname参数是一个相对路径名,fchownat函数计算相对于打开目录的pathname。

基于BSD的系统一直规定只有超级用户才能更改一个文件的所有者。这样做的原因是防止用户改变其文件的所有者从而摆脱磁盘空间限额对他们的限制。System V则允许任一用户更改他们所拥有的文件的所有者。

按照_POSIX_CHOWN_RESTRICTED的值,POSIX.1允许在这两种形式的操作中选用一种。

对于Solaris 10,此功能是个配置选项,其默认值是施加限制。而FreeBSD 8.0、Linux 3.2.0和Mac OS X 10.6.8则总对chown施加限制。

回忆2.6节,_POSIX_CHOWN_RESTRICTED常量可选地定义在头文件<unistd.h>中,而且总是可以用pathconf或fpathconf函数进行查询。此选项还与所引用的文件有关—可在每个文件系统基础上,使该选项起作用或不起作用。在下文中,如提及“若_POSIX_CHOWN_ RESTRICTED生效”,则表示“这适用于我们正在谈及的文件”,而不管该实际常量是否在头文件中定义。

若_POSIX_CHOWN_RESTRICTED对指定的文件生效,则

(1)只有超级用户进程能更改该文件的用户ID;

(2)如果进程拥有此文件(其有效用户ID等于该文件的用户ID),参数owner等于-1或文件的用户ID,并且参数group等于进程的有效组ID或进程的附属组ID之一,那么一个非超级用户进程可以更改该文件的组ID。

这意味着,当_POSIX_CHOWN_RESTRICTED有效时,不能更改其他用户文件的用户ID。你可以更改你所拥用的文件的组ID,但只能改到你所属的组。

如果这些函数由非超级用户进程调用,则在成功返回时,该文件的设置用户ID位和设置组ID位都被清除。
0 0
原创粉丝点击