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

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

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

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

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

Спасибо!

Ответов (5)

Решение

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

open ('путь', O_WRONLY | O_CREAT, 0640);

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

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

O_CREAT

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

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

Просто используйте необязательный третий аргумент, чтобы 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) .

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