Linux环境编程文件权限操作之chmod, fchmod, fchmodat

本篇记录Linux环境编程文件权限操作之chmod, fchmod, fchmodat的基本用法。

首先查看帮助文档

1.chmod函数用于修改文件权限。

函数名chmod
相关函数fchmod, fchmodat
表头文件#include <sys/stat.h>
函数定义int chmod(const char *pathname, mode_t mode);
函数说明

chmod 函数用于修改文件权限,它允许用户设置文件的读(r)、写(w)和执行(x)权限,以及特殊权限,如设置用户ID(setuid,简称suid)和粘滞位(sticky bit)。

pathname 是要改变权限的文件或目录的路径;

mode:指定新的权限模式,与 open 函数的第三个参数一样。权限模式可以通过运算符" | "组合:

    S_IRWXU:为文件所有者设置读、写和执行权限。
    S_IRUSR:为文件所有者设置读权限。
    S_IWUSR:为文件所有者设置写权限。
    S_IXUSR:为文件所有者设置执行权限。
    S_IRWXG:为文件所属组设置读、写和执行权限。
    S_IRGRP:为文件所属组设置读权限。
    S_IWGRP:为文件所属组设置写权限。
    S_IXGRP:为文件所属组设置执行权限。
    S_IRWXO:为其他用户设置读、写和执行权限。
    S_IROTH:为其他用户设置读权限。
    S_IWOTH:为其他用户设置写权限。
    S_IXOTH:为其他用户设置执行权限。
    S_ISUID:设置文件的setuid位。
    S_ISGID:设置文件的setgid位。
    S_ISVTX:设置文件的粘滞位。

返回值成功时返回0,失败则返回 -1,错误码设置在errno中。

示例:

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

using namespace std;

int main()
{
    //要修改权限的文件名
    const char *filename1 = "/home/scott/trunk/command2/chmod_teset1.txt";
    mode_t mode1 = 0644; // 设置新的权限为 644

    if (chmod(filename1, mode1)) {
        perror("chmod Failed =====1");
        return EXIT_FAILURE;
    }

    const char *filename2 = "/home/scott/trunk/command2/chmod_teset2.txt";
    mode_t mode2 = S_IRUSR | S_IWUSR | S_IXUSR; // 设置文件所有者的读、写和执行权限
    if (chmod(filename2, mode2)) {
        perror("chmod Failed =====2");
        return EXIT_FAILURE;
    }

    printf("File permissions changed successfully.\n");

    cout << "Hello Ubuntu1804!" << endl;
    return 0;
}

运行结果:

2.fchmod函数用于修改文件权限。

函数名fchmod
相关函数chmod, fchmodat
表头文件#include <sys/stat.h>
函数定义int fchmod(int fd, mode_t mode);
函数说明

fchmod 函数用于修改文件权限。

fd是打开的文件描述符;

mode:指定新的权限模式

返回值成功时返回0,失败则返回 -1,错误码设置在errno中。

示例:

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

using namespace std;

int main()
{
    //要修改权限的文件名
    const char *filename3 = "/home/scott/trunk/command2/chmod_teset3.txt";
    // 打开或创建文件
    int fd3 = open(filename3, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    mode_t mode3 = 0644; // 设置新的权限为 644

    if (fchmod(fd3, mode3)) {
        perror("chmod Failed =====3");
        return EXIT_FAILURE;
    }
    close(fd3);

    const char *filename4 = "/home/scott/trunk/command2/chmod_teset4.txt";
    mode_t mode4 = S_IRUSR | S_IWUSR | S_IXUSR; // 设置文件所有者的读、写和执行权限
    // 打开或创建文件
    int fd4 = open(filename4, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fchmod(fd4, mode4)) {
        perror("chmod Failed =====4");
        return EXIT_FAILURE;
    }
    close(fd4);

    printf("modd3====%d mode4===%d\n", mode3, mode4);
    printf("File permissions changed successfully.\n");

    cout << "Hello Ubuntu1804!" << endl;
    return 0;
}

运行结果:

3.fchmodat函数用于修改文件权限。

函数名fchmodat
相关函数chmod, fchmod
表头文件#include <sys/stat.h>
函数定义int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
函数说明

fchmodat 函数用于修改文件权限。

参数说明:

  • dirfd: 文件描述符,指向包含目标文件的目录。如果设置为 AT_FDCWD,则表示当前工作目录。(如果路径名是绝对的,则忽略dirfd)
  • pathname: 要更改权限的目标文件名或路径。
  • mode: 新的权限模式(八进制数),例如 0644 或者 S_IRWXU 宏组合。
  • flags: 可选标志位,目前仅支持 AT_SYMLINK_NOFOLLOW,即不跟随符号链接。
返回值成功时返回0,失败则返回 -1,错误码设置在errno中。

示例:

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

using namespace std;

int main()
{
    const char *dirname = "/home/scott/trunk/command2";
    const char *filename = "chmod_teset6.txt";
    mode_t new_mode = 0644; // 设置新的权限为 644

    // 打开或创建文件
    int dir_fd = open(dirname, O_RDONLY | O_DIRECTORY);

    if(dir_fd == -1)
    {
        perror("open directory");
        exit(EXIT_FAILURE);
    }

    // 使用 fchmodat 修改文件权限
    if(fchmodat(dir_fd, filename, new_mode, 0) == -1)
    {
        perror("fchmodat failed");
        return 1;
    }
    else
    {
        printf("File '%s/%s' permissions successfully changed to %o\n", dirname, filename, new_mode);
    }

    cout << "Hello Ubuntu1804!" << endl;
    return 0;
}

运行结果:

参考嵌入式Linux系统编程 — 3.4 access、chmod和 umask函数修改文件访问权限_linux access-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值