`mkfifo`で生成されたFIFOと同じように`mknod`で生成された名前付きパイプはありますか?

`mkfifo`で生成されたFIFOと同じように`mknod`で生成された名前付きパイプはありますか?

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

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

答え1

はい、それらは同じですが、ブロックや文字デバイスではなく実際にFIFOを作成するように指示した場合にのみ明らかになりますmknod(devtmpfs / udevがこれを行うため、最近ではほとんど行われません)。

mkfifo foobar
# same difference
mknod foobar p

これらstrace2つのコマンドは同じです。

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とそのデバイスのメジャー番号とマイナー番号で実行できる他のすべての操作よりも移植可能な概念であるためです。mknodPOSIXの初期バージョンもシステムコールを省略しました。

したがって、古代のUNIXの移植性のためにはmknod ... pより良いです。最新のシステムでは、mkfifo少し良いですが、mknod ... p動作しない実際の最新のUNIXを見つける可能性はほとんどありません。

関連情報