Аргумент "режим" open () не устанавливает правильные разрешения для файла - PullRequest
0 голосов
/ 07 мая 2020

Мое намерение состояло в том, чтобы открыть два файла, где второй будет совершенно новым, с теми же разрешениями, что и первый файл. Итак, чтобы проверить свой код, я изменил права доступа к первому файлу на «777». Затем я приступил к запуску своей программы. И, к моему удивлению, разрешение новорожденного файла2 оказалось неправильным! Они были установлены на 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;
}

Я попытался сделать его как можно более аккуратным:)

1 Ответ

0 голосов
/ 07 мая 2020

Из справочной страницы open (2) в части, посвященной O_CREATE:

Действующий режим модифицируется umask процесса обычным способом: при отсутствии ACL по умолчанию режим созданный файл - (mode & ~ umask).

Если вы наберете umask в bash, вы увидите, какое значение используется и какие биты очищаются из предоставленного вами режима.

...