名前付きパイプは「mknod」によって作成され、FIFOは「mkfifo」によって作成されますか?


22

このmkfifo <file>コマンドを使用して名前付きFIFOを作成しました。1つのプロセスがファイルに書き込み、別のプロセスがファイルから読み取ります。

これで、mknodコマンドが名前付きパイプを作成できることがわかりました。これらの名前付きパイプは、によって作成されたFIFOと同等mkfifoですか、それとも異なる機能がありますか?

回答:


29

はい、それは同等ですが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ます。


16
Qはタグ付けされていないので[linux]、OPは確かに気にしませmkfifo(2) んが、BSDでは実際には別のシステムコールであることに注意してくださいmknod(2)(しかし、それはまったく同じことをすることになりますmknod(S_FIFO))。
mosvy

@frostschutz-すばらしい回答をありがとう。だから物事を明確にするために。mkfifoそしてmknod、実際に使用してプログラムされているmknodFIFOを作成するには、システムコール(今日の前に、そのシステムコールを知っていたしませんでしたが)。「FIFO」と「名前付き」という用語を同じ意味で使用していると思います。それらは同じものですか?双方向の名前付きパイプは、Unixドメインソケットによって実装されますよね?
z正

はい、「名前付きパイプ」とFIFOは通常同じものを指します(パイプのコンテキストでは、FIFOはパイプの外側にも存在する概念です)。ソケットはまったく別の獣です。ここでの興味深い答えは、unix.stackexchange.com
q

@frostschutz-ありがとう。私が最も混乱したのは、名前付きパイプについて考えるとき、双方向パイプについても考えているということだと思います-FIFOは間違いなく双方向(AFAIK)ではありません。
z正

@Shuzheng a FIFOには、方向に関するルールはありません。それは本当に読み書きだけです。リーダーとライターの数には制限はありませんが、書き込まれたものは1回しか読み取ることができないため、最終的に誰がデータを取得するかは不明です。
frostschutz

18

移植性の極限を除き、これらは同等です。mknod ... pもともとは名前付きパイプを作成する唯一の方法でしたがmkfifo、おそらく名前付きパイプはmknodデバイスやメジャー番号とマイナー番号でできることよりも本質的に移植性の高い概念であるため、POSIXはそれを省略して代わりに発明することを選択しました。mknodシステムコールはまた、POSIXの早期verionsから取り残されました。

そのため、古代のUNIXへの移植性についてmknod ... pは、より優れています。現代のシステムでmkfifoは、わずかに優れていますが、実際にmknod ... p動作しないUNIXが実際に見つかることはほとんどありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.