1. 程式人生 > >linux send函式的一個引數理解

linux send函式的一個引數理解

         一個簡單的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.