mknod (2) требует суперпользователя на FreeBSD, что вместо этого использовать? - PullRequest
1 голос
/ 24 октября 2010

Я портирую с 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 ]

2 голосов
/ 24 октября 2010

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

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

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

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

1 голос
/ 24 октября 2010

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

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

std::fstream(_resolvedName); // Temporary object opens and closes in the
                             // same statement thus creating empty file.
...