открывать и открывать файлы с разными правами доступа - PullRequest
2 голосов
/ 29 июля 2010

Эти два фрагмента кода создают файлы с разными правами доступа к файлам. В примере 1 создаются ожидаемые разрешения по умолчанию для файлов, а в примере 2 - нет. Чем это объясняется?

ОС: Mac OS X версия: 10.6.4

Версия Xcode: 3.2.2, 64 бита


// Example 1
FILE *fh1 = fopen("Test1.txt", "w+x");

if (fh1) {
    fwrite("TEST1", 1, 5, fh1);
    fclose(fh1);
}

Создает: -rw-r - r-- 1 me staff 5 29 июля 00:41 Test1.txt

// Example 2
int fh2 = open("Test2.txt", O_EXCL | O_CREAT | O_WRONLY);

if (fh2 >= 0) {
    write(fh2, "TEST2", 5);
    close(fh2);
}

Создает: ---------- 1 me персонал 5 29 июля 00:41 Test2.txt

Ответы [ 2 ]

6 голосов
/ 29 июля 2010

Когда вы используете O_CREAT, вам нужно добавить третий аргумент в open, режим.Например:

int fh2 = open("Test2.txt",
               O_EXCL | O_CREAT | O_WRONLY,
               S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

Это будет эквивалентно 0666. Имейте в виду, что этот режим затем маскируется umask процесса, то есть указанные вами разрешения обычно немного уменьшаются.Типичным значением umask является 0022, что приводит к режиму 0666 & ~ 0222 = 0644, то есть -rw-r--r--.

From man open :

Аргумент oflag может указывать на то, что файл должен быть создан, если он не существует (путем указания флага O_CREAT).В этом случае для открытия требуется третий аргумент mode_t mode;файл создается в режиме mode , как описано в chmod(2), и изменяется значением umask процесса (см. umask(2)).

2 голосов
/ 29 июля 2010
int open(const char *pathname, int flags, mode_t mode);

Аргумент mode указывает разрешения для использования в случае создания нового файла. Смотри http://linux.about.com/od/commands/l/blcmdl2_open.htm

В вашем случае вам нужно установить mode со значением 0644

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