2017-03-25 26 views

答えて

4

mkfifo()を使用することは、標準化されており、移植性があります。一般的にmknod()を使用すると移植性がありません。これはPOSIXの一部です(この回答の以前のバージョンとは逆の記述ですが)。 POSIX仕様では、mkfifo()が望ましいとされています。それ以外の場合は、mkfifo()mknod()で作成されたFIFOに違いはありません。

mknod()は、FIFO以外のデバイスタイプを作成するために使用できます。これは、ブロック特殊文字特殊装置を作成することができます。かつて非常に(非常に)非常に長い時間前に、mkdir()またはrmdir()システムコールがある前の日に、mknod()がディレクトリを作成するために使用されました。ディレクトリを作成した後、...のエントリを新しいディレクトリに作成するには、link()を2回使用する必要がありました。 (そして、あなたはそれを使うためにroot特権を持っていなければならなかったので、mkdirrmdirコマンドはSUID rootでした。)ファイルシステムはもはやゲームの一部ではないので、

参考: - :「mknodを `の唯一のポータブル使用が()` FIFOスペシャルファイルを作成することであるVersion 7 Unix 1979年頃

+1

オム、私の 'mknod'マンページでは、«POSIX.1-2001は言う言います。 'mode'が' S_IFIFO'でないか 'dev'が' 0'でない場合、 'mknod()'の動​​作は不明です。 "»ので、' m_mod 'と 'S_IFIFO' *は確かに標準です。これはhttp://pubs.opengroup.org/onlinepubs/9699919799/functions/mknod.htmlで確認されていますが、 "FIFO特殊ファイルを作成するために、この関数よりも' mkfifo() '関数が優先されます。" –

+1

@MatteoItalia:ああ、ありがとう。 'mknod()'がPOSIXに入っているのは間違いありません。 'mkfifo()'(そして 'mkdir()'と 'rmdir()')の存在を考えると、関数は実際に余計です。私はそれが標準化されていることに驚いています。第3引数の初期化されていない値で関数がスペックに示されているのは興味深いです: 'dev_t dev; int status = mknod( "/ home/cnd/mod_done"、S_IFIFO | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH、dev); ' - ' dev'は初期化されていません。この値を0に設定すると正常です。第七版マニュアルにそれを示唆する言葉がありました。 –

関連する問題