`mknod` 创建的命名管道和 `mkfifo` 创建的 FIFO 等效吗?

`mknod` 创建的命名管道和 `mkfifo` 创建的 FIFO 等效吗?

我使用该mkfifo <file>命令创建了命名 FIFO,其中一个进程写入文件,另一个进程从文件读取。

现在,我知道该mknod命令能够创建命名管道。这些命名管道是否与 所创建的 FIFO 等效mkfifo,或者它们有不同的功能吗?

答案1

是的,它们是等效的,但显然只有当你告诉mknod实际创建一个 FIFO,而不是一个块或字符设备时才会这样(现在很少这样做,因为 devtmpfs/udev 会为你完成)。

mkfifo foobar
# same difference
mknod foobar p

strace两个命令是相同的:

mknod("foobar", S_IFIFO|0666)           = 0

所以就系统调用而言,mkfifo实际上是 的简写mknod

那么,最大的区别在于语义。您mkfifo可以一次性创建一堆 FIFO:

mkfifo a b c

对于mknod,由于您必须指定类型,因此它只接受一个参数:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

一般来说,mknod可能很难正确使用。因此,如果您想使用 FIFO,请坚持使用mkfifo.

答案2

除了在可移植性的极端边缘之外,它们是等效的。mknod ... p最初是创建命名管道的唯一方法,但 POSIX 选择忽略它并发明它mkfifo,大概是因为命名管道本质上是一个比所有其他东西mknod可以对设备及其主要和次要数字执行的概念更便携的概念。mknodPOSIX 的早期版本也省略了系统调用。

因此,对于古代 UNIX 的可移植性来说,mknod ... p是更好的。对于现代系统来说,mkfifo稍微好一点,尽管你不太可能找到一个mknod ... p不工作的实际现代 UNIX。

相关内容