Ответ 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()
несколько небезопасным.