mknod(2) требует суперпользователя на FreeBSD, что вместо этого использовать?

Я портирую с Linux на FreeBSD и столкнулся с::mknod() с ошибкой из-за errno:

[EINVAL]           Creating anything else than a block or character spe-
                   cial file (or a whiteout) is not supported.

Но я также вижу, что это говорится ранее на странице руководства:

 The mknod() system call requires super-user privileges.

Итак, какой будет хороший вызов для замены, который будет работать как на Linux, так и на FreeBSD?

Мой фрагмент кода, где это происходит:

mode_t mode
  = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

if (::mknod(_resolvedName, mode, 0)) {

Моя цель - создать пустой файл с правильными разрешениями.

2 ответа

Решение

Согласно справочной странице Linux для mknod(2):

В POSIX.1-2001 говорится: "Единственное переносимое использование mknod() - это создание специального файла FIFO. Если mode не S_IFIFO или dev не 0, поведение mknod() не определено".

Таким образом, его использование таким образом непереносимо и не рекомендуется.

open(2)Однако, похоже, он обладает необходимой вам функциональностью и создаст файл нулевого размера. Он принимает третий параметр типа mode_t, с помощью которого вы можете установить разрешения.

Моя цель - создать пустой файл с правильными разрешениями.

Почему бы и нет:

std::fstream(_resolvedName); // Temporary object opens and closes in the
                             // same statement thus creating empty file.
Другие вопросы по тегам