Answers:
是的,它是等效的,但显然只有在您告诉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
。
mkfifo
而mknod
实际使用中的程序mknod
系统调用(不知道今天之前的系统调用)来创建一个FIFO。我猜您可以互换使用术语“ FIFO”和“命名”。它们是一样的吗?双向命名管道是通过Unix域套接字实现的,对吗?
除了在便携性的极端方面,它们是等效的。mknod ... p
最初是创建命名管道的唯一方法,但是POSIX选择省略它,mkfifo
而是发明了它,大概是因为命名管道本质上比其他任何东西mknod
都可以使用设备及其主要和次要数字进行移植。该mknod
系统调用也留下了POSIX的早期verions出来。
因此,对于可移植到古代UNIX而言,mknod ... p
更好。对于现代系统,mkfifo
它会稍好一些,尽管您不太可能会发现一个实际的现代Unix mknod ... p
无法正常工作。
mkfifo(2)
确实是一个单独的系统调用mknod(2)
(但是最终会做与完全相同的事情mknod(S_FIFO)
)。