【问题标题】:is mknod portable? if not, what is the alternative?mknod 是便携式的吗?如果没有,有什么替代方法?
【发布时间】:2010-12-28 13:20:34
【问题描述】:

我想在我的代码中使用mknod 来创建一个文件,但是man 说,

mknod() 的唯一可移植用途是创建一个 FIFO 专用文件。如果 mode 不是 S_IFIFO 或 dev 不是 0,则 mknod() 未指定。

这是否意味着 mknod 不是真正可移植的,我应该使用其他方式来创建函数?拨打open 和即时close 怎么样?哪种方式更安全?

【问题讨论】:

    标签: c posix mknod


    【解决方案1】:

    mknod 不用于创建文件。它用于创建设备节点。可移植应用程序永远不需要创建设备节点,因为它们是否存在、它们是什么以及它们是如何实现/编号的都是实现细节

    mknod 历史上也允许您创建 fifos(可能还有普通文件?),但是有一些标准接口:mkfifo 用于 fifos,creat(或 openO_CREAT)对于普通文件。

    【讨论】:

    • 仍然,我需要打开然后关闭返回的描述符,这需要两个操作(和四个该死的行,因为我总是检查返回码)。那么创建文件就没有单一的操作了吗?
    • 我一般认为检查close的返回值没用。如果你向它传递一个有效的文件描述符,close 可能失败的唯一方法是你安装了一个中断信号处理程序(我认为这是有害的,除了非常孤立和有意使用)或 I/O 错误(例如NFS)。而且由于确实没有从后者中恢复的好方法,所以我遵循“永远不要测试你不知道如何处理的错误”的原则。 :-)
    • 哦,但要回答你的问题,不,没有单个库调用来创建文件。您确定要在不打开文件的情况下创建文件吗?通常你想在创建新文件时使用O_EXCL,以确保你确实是创建它的人,如果你关闭并稍后重新打开文件,O_EXCL 的全部意义就被打败了。
    【解决方案2】:

    如果您阅读该段的其余部分,您会看到:

    However, nowadays one should never use mknod() for this purpose;
    one should use mkfifo(3), a function especially defined for this purpose.
    

    所以POSIX.1-2001在这里说的已经过时了。我会忽略它。 mknod仍被 Linux 系统中的 init 脚本使用。

    【讨论】:

    • 在一个 linux 初始化脚本中,mknod 被用于一个适当的实现特定目的,即创建一个设备节点。
    • 我假设作者要求创建一个设备节点:)
    • OP 似乎正在使用它来创建普通文件。在我多年的 unix 编码中,我不知道 mknod 的实现甚至可以做到这一点,这听起来像是对函数的非常可怕的滥用......
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多