Shuzheng Asked: 2019-07-29 03:32:43 +0800 CST2019-07-29 03:32:43 +0800 CST 2019-07-29 03:32:43 +0800 CST 由 `mknod` 创建的命名管道和由 `mkfifo` 创建的 FIFO 是否等效? 772 我使用该mkfifo <file>命令创建了命名的 FIFO,其中一个进程写入文件,另一个进程从文件中读取。 现在,我知道该mknod命令能够创建命名管道。这些命名管道是否等同于创建的 FIFO mkfifo,或者它们具有不同的特性? fifo 2 个回答 Voted Best Answer frostschutz 2019-07-29T04:43:28+08:002019-07-29T04:43:28+08:00 是的,它是等价的,但显然只有当你告诉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. user41515 2019-07-29T05:37:04+08:002019-07-29T05:37:04+08:00 除了在便携性的极端边缘之外,它们是等效的。mknod ... p最初是创建命名管道的唯一方法,但 POSIX 选择省略它并mkfifo改为发明,大概是因为命名管道本质上是一个比其他东西mknod可以对设备及其主要和次要数字做的所有事情都更便携的概念。系统mknod调用也被排除在 POSIX 的早期版本之外。 因此,对于古代 UNIX 的可移植性,mknod ... p更好。对于现代系统来说,mkfifo稍微好一点,尽管你不太可能找到一个真正的现代 unix 在那里mknod ... p不起作用。
是的,它是等价的,但显然只有当你告诉
mknod
实际创建一个 FIFO,而不是一个块或字符设备时(这些天很少这样做,因为 devtmpfs/udev 会为你做这件事)。这
strace
两个命令是相同的:所以就系统调用而言,
mkfifo
实际上是mknod
.那么,最大的区别在于语义。您可以一次性
mkfifo
创建一堆 FIFO:使用
mknod
,因为你必须指定类型,它只接受一个参数:一般来说,
mknod
可能很难正确使用。因此,如果您想使用 FIFO,请坚持使用mkfifo
.除了在便携性的极端边缘之外,它们是等效的。
mknod ... p
最初是创建命名管道的唯一方法,但 POSIX 选择省略它并mkfifo
改为发明,大概是因为命名管道本质上是一个比其他东西mknod
可以对设备及其主要和次要数字做的所有事情都更便携的概念。系统mknod
调用也被排除在 POSIX 的早期版本之外。因此,对于古代 UNIX 的可移植性,
mknod ... p
更好。对于现代系统来说,mkfifo
稍微好一点,尽管你不太可能找到一个真正的现代 unix 在那里mknod ... p
不起作用。