13-文件权限相关函数—access,chmod,chown函数

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用户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值