linux send函式的一個引數理解
阿新 • • 發佈:2019-01-23
一個簡單的client、server程式碼測試資料傳輸。當建立連線後,client傳送資料給server後,server接著傳送資料給client。
連線斷開後,即client斷開或退出時,server若繼續向client傳送資料,則程式會異常退出。之所以異常退出,是因為此時程序向系統傳送了一個SIGPIPE訊號。要想驗證下,可以設定send函式第三個引數為MSG_NOSIGNAL,即要求程序不把訊號SIGPIPE傳送給系統,而輸出到終端。
至於如果解決這個辦法,可以在程序裡截獲此訊號,具體做法是設定訊號處理函式、然後將其註冊到系統即可。
通過此方法解決這個問題,一定不能忘了send的第四個引數,不能將其設定為MSG_NOSIGNAL,因為設定成MSG_NOSIGNAL後,程序就不把訊號傳送給系統了,我們也就截獲不到了!
函式原型:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
flags:
MSG_NOSIGNAL (since Linux 2.2)
Requests not to send SIGPIPE on errors on stream oriented sockets when the other end breaks the
connection. The EPIPE error is still returned.