web-dev-qa-db-ja.com

名前付きパイプは `mknod`によって作成され、FIFOは` mkfifo`によって作成された同等のものですか?

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

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

22
Shuzheng

はい、それは同等ですが、明らかに、ブロックまたはキャラクターデバイスではなく、実際にFIFOを作成するようにmknodに指示した場合のみです(最近ではdevtmpfs/udevが行うので、めったに行われません)。

mkfifo foobar
# same difference
mknod foobar p

straceでは、両方のコマンドで同じです。

mknod("foobar", S_IFIFO|0666)           = 0

したがって、syscallsに関しては、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を使用してください。

29
frostschutz

これらは、移植性の極限を除いて同等です。 mknod ... pは元々名前付きパイプを作成する唯一の方法でしたが、POSIXはそれを省略してmkfifoを発明することを選択しました。おそらく名前付きパイプは他のすべてのものより本質的に移植性が高いためですmknodデバイスとそのメジャーおよびマイナー番号を使用します。 mknodシステムコールも、POSIXの初期バージョンから除外されました。

したがって、古代UNIXへの移植性のために、mknod ... p 優れている。最近のシステムではmkfifoの方が少し優れていますが、実際のunixがmknod ... pは機能しません。

18
user41515