5

閉じたパイプにメッセージを書き込むと、プログラムがクラッシュします

if (write(pipe, msg, strlen(msg)) == -1) {
    printf("Error occured when trying to write to the pipe\n");
}

pipe書き込む前にまだ開いているかどうかを確認する方法は?

4

1 に答える 1

8

正しい方法は、の戻りコードをテストしてから、次のwriteことも確認することerrnoです。

if (write(pipe, msg, strlen(msg)) == -1) {
    if (errno == EPIPE) {
        /* Closed pipe. */
    }
}

しかし待ってください: 閉じたパイプ no への書き込みは -1 with を返すだけでなく、プロセスを終了errno=EPIPEするシグナルも送信します:SIGPIPE

EPIPE fd は、読み取り側が閉じているパイプまたはソケットに接続されています。これが発生すると、書き込みプロセスも SIGPIPE シグナルを受け取ります。

したがって、そのテストが機能する前に、無視するSIGPIPE必要もあります。

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
    perror("signal");
于 2013-09-26T06:29:47.603 に答える