open () неправильно устанавливает права доступа к файлам - PullRequest
8 голосов
/ 30 января 2012

Я создаю файл, используя следующий код:

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

int main()
{
    const char* filename = "./test.out";
    int fd;
    if(-1 == (fd = open(filename, O_CREAT|O_RDWR, 0666)))
    {
        perror("Error");
        errno = 0;
    }       
    else
        puts("File opened");

    if(-1 == (close(fd)))
    {
        perror("Error");
        errno = 0;
    }
    else
        puts("File closed");

    return 0;
}

Я указываю аргумент mode как 0666, который должен предоставлять доступ на чтение и запись каждому.Однако ls -l показывает

-rw-r--r-- 1 kmehta users 0 2012-01-29 16:29 test.out

Как видите, права на запись предоставляются только владельцу файла.Я не знаю, почему все остальные не получают разрешения правильно.chmod a+w test.out правильно устанавливает разрешения.

Код скомпилирован как gcc -Wall test.c

Характеристики: gcc v 4.5.0 в Opensuse 11.3 64 бит

Ответы [ 2 ]

16 голосов
/ 30 января 2012

Аргумент mode для open указывает максимум разрешенных разрешений.Параметр umask затем применяется для дальнейшего ограничения разрешений.

Если вам нужно задать разрешения 0666, вам нужно будет использовать fchmod на дескрипторе файла после успешного открытия.

5 голосов
/ 30 января 2012

Выполнение этого кода:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
        int fd;
        if((fd = open("new.file",O_CREAT,S_IRWXU | S_IRWXG | S_IRWXO)) == -1)
        {
                perror("open");
                return 1;
        }
        close(fd);
        return 0;
}

на моем компьютере с Linux, где umask возвращает 0022, дает мне файл со следующими атрибутами:

-rwxr-xr-x 1 daniel daniel 0 Jan 29 23:46 new.file

Итак, как вы можете видеть, umask маскирует биты записи в моем случае.Похоже, в вашей системе тоже самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...