如果我在关闭的管道中写一条消息,则程序崩溃
if (write(pipe, msg, strlen(msg)) == -1) { printf("Error occured when trying to write to the pipe\n"); }
pipe在写之前如何检查它是否仍然打开?
pipe
正确的方法是测试的返回码,write然后还要检查errno:
write
errno
if (write(pipe, msg, strlen(msg)) == -1) { if (errno == EPIPE) { /* Closed pipe. */ } }
但是请稍等:写入封闭的管道不仅会返回-1 errno=EPIPE,而且还会发送一个SIGPIPE终止进程的信号:
errno=EPIPE
SIGPIPE
EPIPE fd连接到读数端关闭的管道或插座。发生这种情况时,写入过程还将收到SIGPIPE信号。
因此,在进行测试之前,您还需要 忽略SIGPIPE:
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) perror("signal");