1

我正在从 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)) {

我的目标是创建一个具有正确权限的空文件。

4

2 回答 2

2

根据Linux手册页mknod(2)

POSIX.1-2001 说:“ mknod() 的唯一可移植用途是创建一个 FIFO 专用文件。 如果 mode 不是 S_IFIFO 或 dev 不是 0,则 mknod() 的行为是未指定的。”

因此,您以这种方式使用它是不可移植的,不推荐使用。

open(2)但是,它似乎具有您需要的功能,并将创建一个大小为零的文件,可移植。它接受 type 的第三个参数mode_t,您可以使用它设置权限。

于 2010-10-23T22:52:53.263 回答
1

我的目标是创建一个具有正确权限的空文件。

为什么不:

std::fstream(_resolvedName); // Temporary object opens and closes in the
                             // same statement thus creating empty file.
于 2010-10-23T22:29:22.770 回答