Fifo由
由 mknod
創建的命名管道和由 mkfifo
創建的 FIFO 是否等效?
我使用該
mkfifo <file>
命令創建了命名的 FIFO,其中一個程序寫入文件,另一個程序從文件中讀取。現在,我知道該
mknod
命令能夠創建命名管道。這些命名管道是否等同於創建的 FIFOmkfifo
,或者它們具有不同的特性?
是的,它是等價的,但顯然只有當你告訴
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
.