2011-07-29 5 views
0

私のC++プログラムに名前付きパイプがあります。子プロセスはその中に値を書き込み、親プロセスはそれを読み取ります。私はmkfifoでパイプを作成しました。すべての操作がブロックされています(FIFOは書き込み用に開かれる前に読み込めません。 残念なことに、私のchildprocessは、子プロセスが実行するプログラムのエラーのため停止しません。私の仕事はこの外部プログラムでこのエラーを修正するが、親プロセスはブロックされたopen fifo呼び出しで無限に停止しないようにしたいが、ある時間後に(パイプの値を読み取らずに)続ける。WaitNamedPipeやC++/linuxでこれを実現する方法はありますか? (プロセスが無限の時間パイプをブロックしないように)

だから私はそれがWaitNamedPipe関数のように代必要なもの。この関数は、経過のいずれかのタイムアウト時間まで待つか、指定した名前付きパイプのインスタンスは、接続のために利用可能である。http://ist.marshall.edu/ist480acp/namedpipes.html#WaitNamedPipe

Anotこれを実現する彼女の道はもちろん働く。親プロセスでループを試してみました。このループでは、読み取りのためにパイプを常に開こうとしましたが、開けないとスリープします。 これは効果がないようです。おそらく親プロセスが最初のオープンコールでブロックしているからです。

ありがとうございました。

答えて

2

非ブロックパイプを使用し、select()コールでタイムアウトを使用できます。または、alarm()と呼ばれるブロッキングread()コールを使用することもできます。

+0

ノンブロッキングパイプにはどのような意味がありますか?一般的に、ブロックは良いと思います。子プロセスが終了しない場合(ちょっとしたことではありません)、ブロックしすぎないようにしてください。 – Lin

+0

http://www.kernel.org/doc/man-pages/online/pages/man7/pipe.7.htmlのPIPE_BUFまでスクロール –

+0

'alarm' +' read'は避けられない競合状態: 'read'が始まる前にアラームが消えるかもしれません。 (Linuxはリアルタイムオペレーティングシステムではないので、 'alarm'呼び出しと' read'呼び出し間の時間の長さは保証されていません) 'select'(または' poll')をタイムアウトは正常に機能し、正解です。 – Nemo

3

O_NONBLOCKopen(2)フラグに追加する場合は、fifo(7)を参照してください。次に、select(2)またはpoll(2)を入力して待ちます(タイムアウトあり)。

関連する問題