このmkfifo <file>
コマンドを使用して、あるプロセスがファイルに書き込み、別のプロセスがファイルから読み取る名前付きFIFOを作成しました。
これで、このmknod
コマンドで名前付きパイプを作成できることがわかりました。これらの名前付きパイプは生成されたFIFOと同じですかmkfifo
、それとも異なる機能を持っていますか?
答え1
はい、それらは同じですが、ブロックや文字デバイスではなく実際にFIFOを作成するように指示した場合にのみ明らかになりますmknod
(devtmpfs / udevがこれを行うため、最近ではほとんど行われません)。
mkfifo foobar
# same difference
mknod foobar p
これらstrace
2つのコマンドは同じです。
mknod("foobar", S_IFIFO|0666) = 0
したがって、システムコールの観点からmkfifo
実際には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
。
答え2
移植性の極端を除いて同じです。mknod ... p
もともと名前付きパイプを生成する唯一の方法だったPOSIXは、それを無視してそれを発明することにしましたmkfifo
。おそらく、名前付きパイプは、本質的にデバイスmknod
とそのデバイスのメジャー番号とマイナー番号で実行できる他のすべての操作よりも移植可能な概念であるためです。mknod
POSIXの初期バージョンもシステムコールを省略しました。
したがって、古代のUNIXの移植性のためにはmknod ... p
より良いです。最新のシステムでは、mkfifo
少し良いですが、mknod ... p
動作しない実際の最新のUNIXを見つける可能性はほとんどありません。