Fifo

mknod 創建的命名管道和由 mkfifo 創建的 FIFO 是否等效?

  • July 29, 2019

我使用該mkfifo <file>命令創建了命名的 FIFO,其中一個程序寫入文件,另一個程序從文件中讀取。

現在,我知道該mknod命令能夠創建命名管道。這些命名管道是否等同於創建的 FIFO mkfifo,或者它們具有不同的特性?

是的,它是等價的,但顯然只有當你告訴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.

引用自:https://unix.stackexchange.com/questions/532578