mkfifo()和mknod()的区别

16

在创建命名管道时,mkfifo()和mknod()有什么区别?

我尝试搜索,但没有得到满意的答案。

1个回答

26
使用 mkfifo() 是标准化和可移植的。通常情况下,使用 mknod() 不是可移植的,这是 POSIX 的一部分(尽管在此答案的早期版本中有相反的说法)。POSIX 规范指出应优先考虑 mkfifo()。否则,mkfifo()mknod() 创建的 FIFO 没有区别。
请注意,mknod() 可用于创建除了 FIFO 以外的其他设备类型。它可以创建块设备和字符设备。很久很久以前,mknod() 也用于创建目录——在出现 mkdir()rmdir() 系统调用之前的日子里。创建目录后,您必须使用两次 link() 来创建新目录中的 ... 条目。(而且您必须具有 root 特权才能使用它,因此 mkdirrmdir 命令是 SUID root 的。)由于这已经不再是游戏的一部分,文件系统现在更加可靠。

参考:Version 7 Unix — 大约在 1979 年。


2
哦,我的mknod手册上写着:“POSIX.1-2001说:‘mknod()的唯一可移植用途是创建FIFO特殊文件。如果mode不是S_IFIFOdev不是0,则mknod()的行为未指定。’”,因此似乎使用S_IFIFOmknod确实是标准的。这在http://pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.html中得到了确认,但有一个警告:“对于制作FIFO特殊文件,应优先使用`mkfifo()`函数。” - Matteo Italia
1
@MatteoItalia:哦,嗯,谢谢。你说的mknod()确实在POSIX中存在,这让我很惊讶。考虑到已经有了mkfifo()(以及mkdir()rmdir()),这个函数真的是多余的;我很惊讶它被标准化了。有趣的是,在规范中,该函数用第三个参数的未初始化值进行说明:dev_t dev; int status = mknod("/home/cnd/mod_done", S_IFIFO | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, dev);——dev没有被显示为初始化。将其设置为0是明智的;第7版手册中也有类似的措辞。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接