我使用该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
可以对设备及其主要和次要数字执行的概念更便携的概念。mknod
POSIX 的早期版本也省略了系统调用。
因此,对于古代 UNIX 的可移植性来说,mknod ... p
是更好的。对于现代系统来说,mkfifo
稍微好一点,尽管你不太可能找到一个mknod ... p
不工作的实际现代 UNIX。