如果我将消息写入已关闭的管道,则程序崩溃
if (write(pipe, msg, strlen(msg)) == -1) {
printf("Error occured when trying to write to the pipe\n");
}
在写信之前如何检查pipe
是否仍然打开?
答案 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");