回答:
はい、それは同等ですがmknod
、ブロックデバイスやキャラクターデバイスではなく、実際にFIFOを作成するように指示した場合にのみ明らかになります(最近ではdevtmpfs / udevが行うのでめったに行われません)。
mkfifo foobar
# same difference
mknod foobar p
でstrace
、それは両方のコマンドで同一です。
mknod("foobar", S_IFIFO|0666) = 0
そのmkfifo
ため、syscallsの観点では、実際にはの省略形ですmknod
。
最大の違いは、セマンティクスです。ではmkfifo
、あなたは一度にFIFOの束を作成することができます。
mkfifo a b c
ではmknod
、タイプを指定する必要があるため、1つの引数のみを受け入れます。
# 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
もともとは名前付きパイプを作成する唯一の方法でしたがmkfifo
、おそらく名前付きパイプはmknod
デバイスやメジャー番号とマイナー番号でできることよりも本質的に移植性の高い概念であるため、POSIXはそれを省略して代わりに発明することを選択しました。mknod
システムコールはまた、POSIXの早期verionsから取り残されました。
そのため、古代のUNIXへの移植性についてmknod ... p
は、より優れています。現代のシステムでmkfifo
は、わずかに優れていますが、実際にmknod ... p
動作しないUNIXが実際に見つかることはほとんどありません。
mkfifo(2)
んが、BSDでは実際には別のシステムコールであることに注意してくださいmknod(2)
(しかし、それはまったく同じことをすることになりますmknod(S_FIFO)
)。