最近在寫linux下的socket通信,正常通信是沒有問題,客戶端沒有連接服務器的時候,程序正常運行,當客戶端連接服務器,並且在線的時候,程序也能正常運行,但是當客戶端斷開連接,服務器就自動斷開,導致程序退出。
找了好久原因,包括keepalive檢測client是否斷開,都不行。
后面經過分析,socket通信斷開后,會導致管道破裂,所以程序被迫終止。
解決辦法:
signal(SIGPIPE, SIG_IGN);//手動捕獲管道破裂信號,並忽略
這樣每次客戶端斷開,都會提示讀寫錯誤 :broken pipe
但是程序不會退出,因為已經捕獲了異常管道破裂,這個和java里面的異常捕獲類似 。