【问题标题】:mknod(2) requires superuser on FreeBSD what to use instead?mknod(2) 需要 FreeBSD 上的超级用户来代替使用什么?
【发布时间】:2010-10-23 22:12:33
【问题描述】:

我正在从 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 上都可以使用的好的替代调用是什么?

我的代码 sn-p 发生这种情况:

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

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

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

【问题讨论】:

  • 返回EINVAL,你想做什么?
  • @Ignacio Vazquez-Abrams 添加了代码 sn-p。
  • 你还没有告诉我们你想要创造什么样的东西。

标签: c++ porting freebsd mknod


【解决方案1】:

根据mknod(2) 的 Linux 手册页:

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

所以你以这种方式使用它是不可移植的,不推荐。

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

【讨论】:

    【解决方案2】:

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

    为什么不:

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

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多