web-dev-qa-db-ja.com

名前付きパイプ(mkfifo)でノンブロッキングfopenを実行するにはどうすればよいですか?

Mkfifoを使用して名前付きパイプを作成して開こうとするプログラムがある場合、ブロックせずに読み取りまたは書き込み用のパイプを開くにはどうすればよいですか?

具体的には、GUIの有無にかかわらず実行できるCプログラム(Javaで記述)を作成しています。

Cプログラムでは、mkfifoを使用して名前付きパイプを正常に作成しましたが、作成すると

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/

gUIが書き込み用にそのパイプを開くまで、fopenは戻りません。私がやりたいのは、GUIがパイプに書き込むことを決定したら(もし)パイプを読み取る準備をすることです-ファイル記述子をselect()呼び出しに入れます。 Java GUIが実際に開始されることはないかもしれないと予想するのは合理的です。そのため、特定のポイントで、またはまったくパイプのもう一方の端を開くために、GUIに依存することはできません。

また、書き込み用に2つ目のパイプを開いておくと、同じ問題が発生すると思います。さらに、リーダーのない出力パイプにO_NONBLOCKを設定することはできません。

助言がありますか?

(これはLinuxシステムで実行されています)

17
Zxaos

パイプをopen()_O_RDONLY | O_NONBLOCK_できます。Cストリームが必要な場合は、fdopen()で取得できます。ただし、select() --AFAIKに問題がある可能性があります。ライターのない読み取り用に開いているパイプfdは常に読み取り用に準備されており、read()は0を返すため、select()は無期限に起動します。

これを克服するための厄介な方法は、パイプを開くことです_O_RDWR_;つまり、少なくとも1人のライター(C++プログラム)が必要です。とにかくあなたの問題を解決するでしょう。

14
jpalecek