3
如果我寫郵件給封閉管道,然後我的程序崩潰如何在寫入之前檢查管道是否打開?
if (write(pipe, msg, strlen(msg)) == -1) {
printf("Error occured when trying to write to the pipe\n");
}
如何檢查pipe
是我寫之前還開了?
如果我寫郵件給封閉管道,然後我的程序崩潰如何在寫入之前檢查管道是否打開?
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. */
}
}
別急:寫一個封閉的管道沒有隻返回-1,errno=EPIPE
,它也發送一個信號SIGPIPE
這會終止您的過程:
EPIPE fd連接到讀數結束爲 已關閉的管道或插座。發生這種情況時,寫入過程也會收到一個SIGIPIPE信號。
所以在這之前的測試工作還需要忽略SIGPIPE
:
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
perror("signal");