Я пытаюсь создать файл только для записи в 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*
Вам нужна трехаргументная форма open()
когда вы указываете O_CREAT. Когда вы опускаете третий аргумент, open()
использует любое значение, которое окажется на стеке, где ожидался третий аргумент; это редко бывает последовательный набор разрешений (в вашем примере, похоже, что на стеке было десятичное 12 = восьмеричное 014).
Третий аргумент - это разрешения на файл, которые будут изменены значением umask()
.
int fd2 = open("/tmp/test.svg", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);
Обратите внимание, что вы можете создать файл без прав на запись (для кого-либо другого или любого другого процесса) и при этом иметь возможность писать в него из текущего процесса. Редко возникает необходимость использовать биты execute для файлов, созданных из программы - если только вы не пишете компилятор (а файлы '.svg' обычно не являются исполняемыми!).
Флаги S_xxxx берутся из
и
- вы можете использовать любой заголовок для получения информации (но open()
сам объявлен в
).
Обратите внимание, что фиксированное имя файла и отсутствие защитных опций, таких как O_EXCL
, делают даже пересмотренный вызов open()
несколько небезопасным.