1. access函数
当用open函数打开一个文件时,系统内核会以有效用户和有效用户组对其进行权限测试,access函数是按实际用户和实际组ID来检查pathname参数所指定文件的访问权限。
函数原型:
<unistd.h>
int access(const char *pathname, int mode);
参数说明:
pathname:指定文件的路径
mode:表示要测试的权限,如果测试文件存在mode就为F_OK,R_OK(是否有读权限),W_OK(是否有写权限),X_OK(是否有执行权限),F_OK(测试一个文件是否存在)。
图1-acces函数的mode权限
返回值:
成返回0,说明具备该权限;失败则返回-1并设置errno,说明不具备权限
1.1测试文件是否具备写权限
下面是通过access函数的W_OK参数来测试文件是否具备写权限:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int ret;
if ((ret = access("abc", W_OK)) < 0) { //测试文件是否具有写权限
printf("error ret = %d\n", ret);
perror("abc");
exit(1);
}
printf("ret = %d\n", ret);
printf("abc is exist\n");
return 0;
}
2. 更改文件权限—chmod函数
在前面的学习中我们知道,通过stat函数可以获取文件权限,而chmod函数正好和stat函数相反,chmod函数的作用是修改文件权限,比如将权限指定为0664等。
函数原型:
#include <sys/stat.h>
int chmod(const char *pathname , mode_t mode);
参数说明:
pathname :指定要修改的文件路径。
注意:如果参数pathname指定的是一个符号链接,那么调用chmod函数将会修改符号链接指向的文件访问权限,而非符号链接自身的访问权限。
mode:表示st_mode结构体的权限值(777表示rwx权限,666表示rw权限,一般为用户,用户组,其他用户的权限)。
返回值:
成功则返回0;失败则返回-1并设置errno为相应值。
3. 改变文件用户id和组id—chown函数
chown函数可用于更改文件的用户id和组id,参数owner和group分别为文件指定新的用户id和组id,如果你不想改变某个参数,只需将该参数置为-1,那么对应的id将保持不变。
函数原型:
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
参数说明:
pathname:指定文件的路径名
owner:指定文件新的用户id
gropu指定文件新的组id
返回值说明:
成功则返回0, 失败则返回-1设置errno
4. 更改文件权限实验
代码摘自《linux系统编程手册》
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include <string.h>
//转换用户id
uid_t userIdFromName(const char *name)
{
struct passwd *pwd;
uid_t u;
char *endptr;
if (name == NULL || *name == '\0')
return -1;
u = strtol(name, &endptr, 10);
if (*endptr == '\0')
return u;
pwd = getpwnam(name);
if (pwd == NULL)
return -1;
return pwd->pw_uid;
}
//转换组id
gid_t groupIdFromName(const char *name)
{
struct group *grp;
gid_t g;
char *endptr;
if (name == NULL || *name == '\0')
return -1;
g = strtol(name, &endptr, 10);
if (*endptr == '\0')
return g;
grp = getgrnam(name);
if (grp == NULL)
return -1;
return grp->gr_gid;
}
int main(int argc, char *argv[])
{
uid_t uid;
gid_t gid;
uid = userIdFromName(argv[1]);
gid = groupIdFromName(argv[2]);
//更改文件用户id和组id
if (chown("test.txt", uid, gid) == -1) {
perror("chown");
}
return 0;
}
test.txt文件现在所属用户和用户组:
执行命令,更改文件所属用户是test用户:
./mychown song
运行结果:
我们的要求是只输入了要更改文件所属用户,而程序的执行结果也是和我们预料的一样,把test.txt文件之前所属的test用户改成了song用户。