一尘不染

写入前如何检查管道是否打开?

linux

如果我在关闭的管道中写一条消息,则程序崩溃

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

pipe在写之前如何检查它是否仍然打开?


阅读 257

收藏
2020-06-07

共1个答案

一尘不染

正确的方法是测试的返回码,write然后还要检查errno

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

但是请稍等:写入封闭的管道不仅会返回-1 errno=EPIPE,而且还会发送一个SIGPIPE终止进程的信号:

EPIPE fd连接到读数端关闭的管道或插座。发生这种情况时,写入过程还将收到SIGPIPE信号。

因此,在进行测试之前,您还需要 忽略SIGPIPE

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
    perror("signal");
2020-06-07