mkfifo <file>
コマンドを使用して、名前付きFIFOを作成します。1つのプロセスがファイルに書き込み、別のプロセスがファイルから読み取ります。
これで、mknod
コマンドで名前付きパイプを作成できることがわかりました。これらの名前付きパイプはmkfifo
によって作成されたFIFOと同等ですか、それとも異なる機能を持っていますか?
はい、それは同等ですが、明らかに、ブロックまたはキャラクターデバイスではなく、実際に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
を使用してください。
これらは、移植性の極限を除いて同等です。 mknod ... p
は元々名前付きパイプを作成する唯一の方法でしたが、POSIXはそれを省略してmkfifo
を発明することを選択しました。おそらく名前付きパイプは他のすべてのものより本質的に移植性が高いためですmknod
デバイスとそのメジャーおよびマイナー番号を使用します。 mknod
システムコールも、POSIXの初期バージョンから除外されました。
したがって、古代UNIXへの移植性のために、mknod ... p
優れている。最近のシステムではmkfifo
の方が少し優れていますが、実際のunixがmknod ... p
は機能しません。