Подтвердить что ты не робот

Создайте файл в Linux с помощью C

Я пытаюсь создать файл записи только в C на Linux (Ubuntu). Это мой код:

 int fd2 = open ("/tmp/test.svg", O_RDWR|O_CREAT);

 if (fd2 != -1) {
   //....
 }

Но почему файлы, которые я создал, имеют режим "xr"? Как его создать, чтобы я мог открыть его самостоятельно в командной строке?

------xr--  1 michael michael  55788 2010-03-06 21:57 test.txt*
------xr--  1 michael michael   9703 2010-03-06 22:41 test.svg*
4b9b3361

Ответ 1

Если вы укажете O_CREAT, вам понадобится форма с тремя аргументами open(). Когда вы опускаете третий аргумент, open() использует любое значение, находящееся в стеке, где ожидался третий аргумент; это редко согласованный набор разрешений (в вашем примере, похоже, что десятичный 12 = восьмеричный 014 был в стеке).

Третий аргумент - это права на файл, который будет изменен значением umask().

int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);

Обратите внимание, что вы можете создать файл без разрешения на запись (кому-либо или другому процессу), все еще будучи в состоянии записать его из текущего процесса. Редко приходится использовать исполняемые биты в файлах, созданных из программы, - если вы не пишете компилятор (а файлы .svg обычно не являются исполняемыми файлами!).

Флаги S_xxxx взяты из <sys/stat.h> и <fcntl.h> - вы можете использовать любой заголовок для получения информации (но open() сам объявлен в <fcntl.h>).

Обратите внимание, что фиксированное имя файла и отсутствие защитных опций, таких как O_EXCL, делают даже пересмотренный вызов open() несколько небезопасным.

Ответ 2

Предоставьте разрешения доступа в качестве третьего параметра:

int fd2 = open("/tmp/test.svg", O_RDWR|O_CREAT, 0777);  // Originally 777 (see comments)

if (fd2 != -1) {
    // use file descriptor
    close(fd2);
}

Таким образом, все права на чтение, запись и выполнение будут предоставлены пользователю, группе и другим. Измените третий параметр в соответствии с вашим использованием.