閉じたパイプにメッセージを書き込むと、プログラムがクラッシュします
if (write(pipe, msg, strlen(msg)) == -1) {
printf("Error occured when trying to write to the pipe\n");
}
pipe
書き込む前にまだ開いているかどうかを確認する方法は?
正しい方法は、の戻りコードをテストしてから、次の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");