2013-09-26 89 views

回答

7

正確的方法是測試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");