關於socket通訊時SIGPIPE的問題

2021-06-20 17:14:27 字數 831 閱讀 4162

一,sigpipe訊號的產生

在linux平台下,寫socket的程式時,難免總是會碰到sigpipe 的問題,此時如果不作處理,那你可能需要乙個監控,每1分鐘檢查程序是否存在,不存在的話,就重新啟動,因為程序對sigpipe的預設響應是退出,這肯定不是你想要的最終方案。

sigpipe 的產生是由於往乙個斷開的連線上寫資料,該連線已經被復位,這就會引起作業系統丟擲乙個sigpipe訊號給相應的程序,而相應的程序在收到作業系統這個訊號時,就退出,這是預設的處理方式。

二,遮蔽訊號

我們當然不希望應用退出,此時就要程序把這個訊號給遮蔽掉,這一般是可行的,如下:

struct sigaction action;

action.sa_handler = sig_ign;

sigaction( sigpipe, &action, 0 );

或者簡單的

signal(sigpipe,sig_ign);

這在大部分時候都是可行的,系統可以遮蔽這個錯誤,並且給write返回-1,表示寫錯了。

三,多執行緒的時候

但在多執行緒的時候,你可能在主線程裡面遮蔽了這個訊號,此時在其它的執行緒中是無效的,其它的執行緒在收到sigpipe訊號時,該退出還是要退出。這是因為執行緒建立的時候,沒有預設從主線程那裡繼承遮蔽操作,可能需要手動操作。

sigset_t signal_mask;

sigemptyset (&signal_mask);

sigaddset (&signal_mask, sigpipe);

關於socket通訊時SIGPIPE的問題

一,sigpipe訊號的產生 在linux平台下,寫socket的程式時,難免總是會碰到sigpipe 的問題,此時如果不作處理,那你可能需要乙個監控,每1分鐘檢查程序是否存在,不存在的話,就重新啟動,因為程序對sigpipe的預設響應是退出,這肯定不是你想要的最終方案。sigpipe 的產生是由於...

關於Socket通訊時通訊協議的制定

在系統開發過程中,如果涉及到了socket通訊,那就要制定好通訊的協議,只有制定好了規則,後面的工作才方便順利展開,製作通訊協議時要考慮到通訊的安全性,必要的資訊要經過加密處理,同時也要考慮到系統的可擴充套件性,如果以後需要增加乙個命令或者修改命令要保證這些工作能方便的進行。協議的內容包括如下 一 ...

關於Socket通訊時通訊協議的制定

在系統開發過程中,如果涉及到了socket通訊,那就要制定好通訊的協議,只有制定好了規則,後面的工作才方便順利展開,製作通訊協議時要考慮到通訊的安全性,必要的資訊要經過加密處理,同時也要考慮到系統的可擴充套件性,如果以後需要增加乙個命令或者修改命令要保證這些工作能方便的進行。協議的內容包括如下 一 ...