2011-11-15 15 views
3

次のコードは、パイプを通じて他のプロセスからのメッセージを読み取ります。すべてのプロセスがすべてのメッセージを正しく出力しますが、whileループを過ぎることはありません。 Eclipseでデバッグを試みましたが、すべてのメッセージを読んだ後、ループ中に停止します。プロセスが読み取りでハングする

インデックスは、各プロセスに割り当てられた番号です。最初のプロセスはインデックス== 0を持ちます。 メッセージ自体は単にメッセージを送信するプロセスのインデックスです。

while((n = read(fd[index][0], &mymsg, sizeof(int))) == sizeof(int)) 
     printf("process%d has received a message from process%d\n", index, mymsg); 

これはどうなるのでしょうか?

// Write to other process 
if(write(fd[index2][1], &index, sizeof(int)) != sizeof(int)) 
    sys_error(2); 

これが5回行われます。ここでは

は、各プロセスが別のものに書き込む方法です。 fdは各プロセスの読み書き終了の表です。

+0

これはなぜあなたが期待する動作ではないのかはっきりしません。どのような条件の下では、コードは 'while'ループを過ぎて進んでいますか? –

+0

@DavidSchwartzバイトを読み取らない場合、エラーが返されます。 – sj755

+0

これらのことが起こると思われる特別な理由はありますか?そうでない場合は、なぜwhileループを終了する必要がありますか? (ファイル記述子は非ブロック化ですか?) –

答えて

5

さらにデータが表示されるまで、read()の呼び出しがブロックされています。 man page for pipe

からプロセスデータが利用可能になるまで、(2)意志 ブロックを読み取り、その後、空のパイプから読み取ろうとした場合。プロセスが フル・パイプ(以下を参照)に書き込もうとすると、書き込みが完了するのに十分なデータがパイプから読み取られるまでブロックを書き込みます(2)。ノンブロッキング fcntl(2)F_SETFL操作を使用して、O_NONBLOCKオープンファイルステータスフラグ を有効にすると、I/Oを実行できます。

しばらくループがそれぞれにこれを行うことを入力する前に、各ファイルディスクリプタを開いた後:

fcntl(fd, F_SETFL, O_NONBLOCK); 

しかし、あなたが本当に含めて、非ブロックI/O対ブロック上に読んでくださいread、fcntlなどのマニュアルページを読んでください。

+0

サンプルコードがありますか?私はその機能にあまり慣れていない。 – sj755

+0

@ seljuq70:fctntlのマニュアルページを試しましたか?私はちょうどGoogleに「fcntl F_SETFL O_NONBLOCK」と入力し、サンプルコードでヒットしました。いずれにせよ、私はいくつかの情報を追加するために私の答えを編集しました。 – kbyrd

+0

私は読んだ前にこれを試しました:fcntl(fd [index] [0]、F_SETFL、O_NONBLOCK);何らかの理由でプロセス0は何も印刷しません。 – sj755

関連する問題