Использование системного вызова open()

Я пишу программу, которая записывает вывод в файл. Если этот файл не существует, я хочу его создать.

В настоящее время я использую следующие флаги при вызове open: O_WRONLY | O_CREATE

Однако, когда это создает файл, он не дает мне никаких прав на запись в него...

Как я могу использовать open, чтобы он создавал файл, если он не существует, но будет ли он создавать необходимые разрешения при необходимости?

Спасибо!

Ответ 1

Вероятно, вам нужен третий аргумент. Например:

open('path',O_WRONLY|O_CREAT,0640);

Ответ 2

Просто используйте необязательный третий аргумент open:

int open(const char* pathname, int flags, mode_t mode);

так:

open("blahblah", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSER | S_IRGRP | S_IROTH);

См. man open(2).

Ответ 3

В Linux есть третий аргумент, который вы можете использовать для передачи разрешений. S_IWUSR должен быть флагом, чтобы дать вам права на запись, но на практике вы, вероятно, захотите использовать больше флагов, чем только один (побитовое или вместе). Проверьте man-страницу для списка флажков разрешений.

Ответ 4

Из руководство:

O_CREAT

Если файл существует, этот флаг не имеет эффекта, кроме как указано в O_EXCL ниже. В противном случае файл должен быть создано; идентификатор пользователя файла должен должен быть установлен на эффективный идентификатор пользователя обработать; идентификатор группы файла должен быть установлен на идентификатор группы файловой родительской директории или эффективный идентификатор группы процесса; и биты разрешения доступа (см. ) файлового режима быть установленным значением третьего аргумент, выбранный как тип mode_t, измененный следующим образом: выполняется побитовое И в битах файлового режима и соответствующие биты в дополнении процесса создания файлового режима маска. Таким образом, все биты в файловом режиме чей соответствующий бит в файле очистка маски создания режима очищается. Когда бит, отличный от файла биты разрешения установлены, эффект неопределенные. Третий аргумент не влияет ли файл открыт для чтения, письма или для обоих. Реализации должны обеспечить инициализировать идентификатор группы файлов идентификатор группы родительского каталога. Реализации могут, но не обязательно, обеспечить определенный путь реализации для инициализации идентификатора группы файлов эффективный идентификатор группы вызывающего процесс.

Итак, вам нужно передать третий аргумент, определяющий требуемые права доступа к файлам.

Ответ 5

Обратите внимание, что в POSIX (Unix, Linux, MacOS и т.д.) вы можете открывать и создавать файл с любыми разрешенными вами разрешениями, включая 0 (без разрешения для кого-либо), и все же записывать в файл, если он открыт для записи.