Использование системного вызова open () - PullRequest
11 голосов
/ 27 февраля 2009

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

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

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

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

Спасибо!

Ответы [ 5 ]

17 голосов
/ 27 февраля 2009

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

open('path',O_WRONLY|O_CREAT,0640);
14 голосов
/ 27 февраля 2009

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

1 голос
/ 28 февраля 2009

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

1 голос
/ 27 февраля 2009

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

O_CREAT

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

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

1 голос
/ 27 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...