函数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;
}