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.