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

blocking c fifo linux named-pipes

mkfifoを使用して名前付きパイプを作成して開こうとするプログラムがある場合、ブロックせずに読み取りまたは書き込み用にパイプを開く方法はありますか。

具体的には、私は(Javaで書かれた)GUIの有無にかかわらず実行することができるCプログラムを書いています。

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

FILE * in = fopen(PIPE_IN、 "r"); / * PIPE_INはファイル名です* /

fopenは、GUIが書き込み用にそのパイプを開くまで戻りません。 私がやりたいのは、そのパイプが一度だけ読み込まれるように準備しておくことです(GUIがそれに書き込むことを決定した場合) – ファイル記述子をselect()呼び出しに入れます。 Java GUIは実際には起動されない可能性があるため、パイプのもう一方の端を特定の時点で開くことはできません。

私はまた書くために開いている2番目のパイプを持つことになります、そして私は私が同じ問題を抱えることになると思います。 さらに、読者のいない出力パイプにO_NONBLOCKを設定することはできません。

助言がありますか?

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

  17  2


ベストアンサー

あなたのパイプを open()`することができますO_NONBLOCK、そしてCストリームが欲しいなら、 fdopen()`で得ることができます。 しかし、 `select() – AFAIKには問題があるかもしれません。書き込み用に開いていない読み込み用のパイプfdは常に読み込み用に準備されていて、 `read()`は0を返します。無期限に発射する。

これを克服するためのくだらない方法は、パイプ `O_RDWR`を開くことです。つまり、少なくとも1人の作家(あなたのCプログラム)を持ってください。 とにかくあなたの問題を解決するでしょう。

13


タイトルとURLをコピーしました