21

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

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

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

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

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

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

助言がありますか?

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

4

1 に答える 1

21

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

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

于 2009-02-24T00:51:37.420 に答える