做一個很簡單的通信模塊:服務器端監聽服務請求並接收數據;客戶端連接服務器段並發送數據。考慮到 一種情況:客戶端向服務器端連續兩次發送數據,而服務器端在accept之後就關閉了連接。
通過在服務器端accept成功之後調用close(fd)模仿這種情形。UNP的5.13節說客戶端在第二次發送數據時會接收到第一次發送數據時服務器端返回的RST從而導致內核發出SIGPIPE信號。於是我在客戶端程序中使用signal(SIGPIPE, sig_pipe)捕捉SIGPIPE信號,程序調試時證明UNP說得沒錯,但在運行狀態時有時候捕捉不到SIGPIPE信號。
仔細看書,UNP第113面的5.12節中有一小段文字講RST被客戶端收到的時間取決於時序問題,於是猜想第二此調用send函數發送數據時有可能服務器端的RST還未返回。為了驗證這個猜想,在第二次發送數據前sleep一下程序,使得RST能在send前返回。測試程序,乖乖,這次都能捕捉到SIPPIPE信號了。
問題是:假如我想100%的捕捉SIGPIPE信號,那麼每次的sleep就會影響到程序的效率。