【问题标题】:Setting permissions for open() system call in C [duplicate]在 C 中设置 open() 系统调用的权限 [重复]
【发布时间】:2019-08-08 11:32:26
【问题描述】:

我正在尝试创建一个对用户组和其他人具有读、写、执行权限的文件,但这没有发生。

我尝试了以下命令

fd = open("file1",O_CREAT| O_WRONLY, 0777); 

这给的权限是

rwx-xr-r-x

我想要

rwxrwxrwx

我尝试修改其他模式,例如

fd2 = open ("file2",O_WRONLY | O_CREAT | O_TRUNC, 0644 );

他们授予了正确的权限

rw-r--r--

我哪里错了?

我的代码

#include <fcntl.h>
#include <stdio.h>

int main(void){
    int fd;
    fd = open("file1",O_CREAT| O_WRONLY, 0777); 
    int fd2;
    fd2 = open ("file2",O_WRONLY | O_CREAT | O_TRUNC, 0644 );


}

【问题讨论】:

  • 查看 man7.org/linux/man-pages/man2/open.2.html 以了解 O_CREAT 标志的可用模式,并按位或选择多个模式。
  • 阅读umask - 它控制进程可以设置的文件权限。
  • 这不是重复的,链接的答案不会尝试显示任何操纵 umask 的代码,因此 OP 可以创建一个实际上具有 0777 权限位的文件
  • @nos 好吧,这是乔纳森的副本
  • @nos :我不同意。 open() not setting file permissions correctly 是完全重复的(06660777 除外,这与问题无关)。同样的问题,同样的解决方案。如果您能提供更好的答案,则可以将其添加到另一个问题中,并且该问题仍应标记为重复。

标签: c linux unix operating-system


【解决方案1】:

Processess 有一个可继承的mode_t-typed 属性,称为 umask,您可以使用 umask 调用对其进行设置。 当您创建具有指定权限P 的文件系统项时,生成的权限为P &amp;~ the_umask

例子:

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
mode_t getumask(void)
{
    mode_t m = umask(0);
    umask(m);
    return m;

}
int main(void){
    unlink("file1");
    unlink("file2");

    int fd;
    mode_t cur_umask = getumask();
    printf("cur_umask=%#o\n", cur_umask);
    mode_t given_mode=0777;
    if(0>(fd = open("file1",O_CREAT| O_WRONLY, given_mode))) return perror("open"),1;

    struct stat sb;
    if(0>fstat(fd,&sb)) return perror("fstat"),1;
    close(fd);
    printf("given_mode=%#o mode=%#o expected_mode=%#o\n", given_mode, 0777&sb.st_mode, given_mode&~cur_umask);


    //Without cur_umask
    int r=0;
    mode_t oldumask = umask(0);
    given_mode=0777;
    if(0>(fd = open("file2",O_CREAT| O_WRONLY, given_mode))) return perror("open"),1;
    if(0>fstat(fd,&sb)) return perror("fstat"),1;
    printf("given_mode=%#o mode=%#o expected_mode=%#o\n", given_mode, 0777&sb.st_mode, given_mode);

    out:umask(oldumask);
    return r;
}

可能的示例输出:

cur_umask=027
given_mode=0777 mode=0750 expected_mode=0750
given_mode=0777 mode=0777 expected_mode=0777

通常,umask 在您的登录会话启动脚本之一(例如,/etc/profile)中使用内置的 umask shell 设置,然后被继承到后代进程。

如果您希望您的 C 进程创建具有完全指定权限的文件系统项,则需要在创建项之前将您的 umask 归零。请记住,如果您打算在 umask 更改后执行,您可能希望在执行之前恢复旧值。

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2014-01-03
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2013-04-10
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多