5

パイプに書き込み/読み取りを試みる前に、パイプが壊れているかどうかを確認することは可能ですか?

while親から複数の子に通信するパイプに書き込むためにループを利用しています。ループの過程で、いくつかの子が閉じます。ループが発生して再度書き込みを試みると、パイプが壊れているため SIGPIPE によって強制終了されるため、プログラムがシャットダウンします。パイプが壊れていることはわかっているので、子供たちにパイプを閉じて終了するようにプログラムしました(必要です)。私はまだループを終了して、プログラムを続行したいと考えています。パイプが壊れているかどうかをチェックし、壊れている場合はスキップして (エラー出力なしで)、プログラムを続行します (他の子にはまだ書き込む必要があります)。

それで、それは可能ですか?cの例は素晴らしいでしょう。

これが私が求めていることの簡単な疑似コード表現です:

int i = 0;

while(i != 5)
{
    if (mypipe[WRITE] is BROKEN)
        //Do Nothing ---Basically Skip

    else if (some condition)
        write(mypipe[WRITE]);

    i++;
}

私の質問の文脈は異なりますが、この質問は私の以前の投稿に関連しています。そこで実際のプログラムのコードを確認できます。

4

3 に答える 3

5

SIGPIPE によって強制終了されたため、プログラムがシャットダウンします

SIGPIPE を無視するシグナル ハンドラーをインストールすると、その動作を変更できます。その場合、パイプへの write() 呼び出しは、プログラムを強制終了する代わりにエラーを返します。

  signal(SIGPIPE, SIG_IGN);

次に、簡単なチェックを行います

ssize_t rc;
rc = write(...);
if (rc == -1) {
    if (errno == EPIPE) {
         //it's broken
    }
 //some other error occured.
}
于 2014-10-14T14:09:12.860 に答える
5

シグナル ハンドラーを無視するように設定してSIGPIPEから、バッファーに書き込み、エラー コードを確認できます。

/* initialization */
signal(SIGPIPE, SIG_IGN);
...

/* try writing to pipe and detect broken pipe */
ssize_t written = write(mypipe[WRITE], buf, size);
if (written == -1 && errno == EPIPE)
  ... remove pipe from the list and continue processing
于 2014-10-14T14:10:39.003 に答える
3

はい、読み書きの前にpoll(2)のような多重化システムコールを使用できます。これにより、読み取り可能性または書き込み可能性をチェックする一連のファイル記述子の中で、どのファイル記述子が読み取り可能 ( に何かを持っているread) および書き込み可能 ( の対象になる可能性があるwrite) かがわかります。

(古いselect(2)多重化システムコールを使用することもできますが、 C10K の問題pollがあるため、私はそれを好みます)

他のスレッドが自分のスレッドの前に何かを行う可能性があることに注意してください。

イベントループが必要です。関連する質問へのこの回答も参照してください。

于 2014-10-14T14:06:05.223 に答える