在写作之前如何检查管道是否打开?

时间:2013-09-26 06:26:04

标签: c linux pipe

如果我将消息写入已关闭的管道,则程序崩溃

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

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

1 个答案:

答案 0 :(得分:7)

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

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

但是等一下:写入已关闭的管道不仅会返回带有errno=EPIPE的-1,还会发送一个SIGPIPE信号来终止您的进程:

  

EPIPE fd连接到读取端为的管道或插座   关闭。当发生这种情况时,写作过程也会收到一个   SIGPIPE信号。

因此,在测试工作之前,您还需要忽略SIGPIPE

if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
    perror("signal");