2010-11-09 37 views
3

可能重複:
Why is writing a closed TCP socket worse than reading one?發送(2)接收SIGPIPE的目的是什麼?

爲什麼沒有錯誤的返回值就足夠了?
我可以在一個信號處理程序中做些什麼,我不能通過測試EPIPE的返回值來做什麼?

+1

查看http://stackoverflow.com/questions/2216374/why-is-writing-a-closed-tcp-socket-worse-than-reading-one(接受的答案有點下降,但解釋了原始當你明確地處理TCP套接字時,通常將SIGPIPE設置爲SIG_IGN,並處理寫入/發送返回-1) – nos 2010-11-09 18:57:08

回答

1

回到過去,幾乎每一個信號都導致Unix程序終止。由於管道之間的進程間通信在Unix中是最基本的,所以SIGPIPE的目的是終止那些不處理錯誤的程序。

假設您有兩個通過管道進行通信的進程。如果其中一個死亡,則管道的一端不再活動。 SIGPIPE也是爲了殺死其他進程。

作爲一個例子,考慮:

cat myfile | grep find_something 

如果cat在讀取文件中喪生,grep根本沒有什麼再做,通過SIGPIPE信號殺害。如果沒有信號發送並且grep沒有檢查返回值read,則grep會以某種方式行爲不當。

0

與其他許多事情一樣,我的猜測是,這只是一個有人做出的設計選擇,最終成爲POSIX標準並一直保持到日期。有人可能認爲試圖通過一個封閉的套接字發送數據是一件壞事,並且您的程序需要立即得到通知,並且由於沒有人檢查錯誤代碼,所以通知您比發送信號更好嗎?

相關問題