open()的 "mode "参数不会为文件设置正确的权限。

问题描述 投票:0回答:1

我的目的是打开两个文件,其中第二个文件是全新的,与第一个文件的权限相同。所以为了测试我的代码,我把第一个文件的权限改为 "777"。然后我继续运行我的程序。令我惊讶的是,新生的文件2的权限是错误的!它们被设置为755。它们的权限被设置为755。更奇怪的是,当我把第一个文件设置为 "111 "并再次尝试时,结果现在是 "1204"。

下面是我的代码

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

int main(int argc, char *args[]) {
    struct stat stats;
    int fd1, fd2;
    fd1 = open("testfile.txt", O_RDONLY);
        /* Error check*/
        if (fd1 == -1) {
            /* Error handling */
            perror("Opening");
            printf("Unable to open file: %s\n", "testfile.txt");
            printf("ERROR: %s\n", strerror(errno));
            return 1;
        }
    if(fstat(fd1, &stats) == -1)
    {
        printf("Error while getting stats: %s\n", strerror(errno));
        exit(-1);
    }

    //Receives the output file as a main argument . . .
    if (argc > 1)
    {
        //(stats.st_mode = Gets the mask of the first file)
        fd2 = open(args[1], O_WRONLY|O_CREAT, stats.st_mode);
        /* Error check*/
        if (fd2 == -1) {
            /* Error handling */
            perror("Opening");
            printf("Unable to open file: %s\n",args[1]);
            printf("ERROR: %s\n", strerror(errno));
            return 1;
        }
    }
    //. . . if it doesn't it creates a standard one warning you about it
    else
    {
        fd2 = open("Nope.txt", O_WRONLY|O_CREAT, stats.st_mode);
        /* Error check*/
        if (fd2 == -1) {
            /* Error handling */
            perror("Opening");
            printf("Unable to open file: %s\n",args[1]);
            printf("ERROR: %s\n", strerror(errno));
            return 1;
        }
        printf("Standard file created\n");
    }
    close(fd1);
    close(fd2);
    return 0;
}

我试着让它尽可能的整洁:)

c file permissions system-calls
1个回答
0
投票

在open(2)的man page中,关于O_CREATE的部分。

进程的umask会以通常的方式修改有效模式:在没有默认ACL的情况下,创建文件的模式是(mode & ~umask)。

如果你输入 umask 在bash中,你可以看到你提供的模式中使用的是什么值和哪些位被清除。

© www.soinside.com 2019 - 2024. All rights reserved.