第三章_文件与目录 : 函数chown 、lchown、fchown

函数chown 、lchown、fchown

使用ls –l命令会给出文件的所有者和文件所有者所处的组。可以通过函数chown、fchown和lchown函数来修改文件所有者和文件所有者所属的组,具体如下:

#include <unistd.h>
int chown(const char *pathname,uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
int fchownat(int fd,const char *pathname,uid_t owner,gid_t group,int flag);
//4个函数的返回值:若成功,返回0;若出错,返回-1

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

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

关于权限问题:
1、超级用户进程可以更改文件的用户ID
2、非超级用户进程更改文件ID
进程有用该文件(有效用户ID等于文件的所有者ID)
owner等于文件的用户ID,group等于进程的有效组ID或进程的添加组ID之一
你可以修改你所拥有的文件的组ID,但只能改到你所属于的组
若非超级用户进程调用成功后,文件的设置用户ID和设置组ID都被清除

测试程序

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
   if ( argc != 2 )
    {
       printf("Usage: %s filename\n", argv[0]);
       return (1);
   }   
   if ( chown(argv[1], 0, 0) < 0 )
    {
       perror("Cannot change the owner!");
       return (1);
   }   
   return (0);
}
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#define RWRWRW  (S_IRUSR |S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
//#define  _POSIX_CHOWN_RESTRICTED -1

int main(void)
{
    umask(0);//remove the mask
    int rv = creat("source.txt",RWRWRW);//creat a file whose mode is -rw-rw-rw-
    system("ln -s source.txt source_l.txt");//create a soft link to "source.txt" whose mode is lrwxrwxrwx
    rv = lchown("source_l.txt",0,0);//update the user ID and group ID to 0
    printf("rv:%d\n",rv);
    printf("errno:%d\n",errno);
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值