關於SIGPIPE導致的程式退出

2021-04-12 11:58:55 字數 2936 閱讀 3935

在unix系統下,如果send在等待協議傳送資料時網路斷開的話,呼叫send的程序會接收到乙個sigpipe訊號,程序對該訊號的預設處理是程序終止。

在unix系統下,如果recv函式在等待協議接收資料時網路斷開了,那麼呼叫recv的程序會接收到乙個sigpipe訊號,程序對該訊號的預設處理是程序終止。

處理方法:

在初始化時呼叫signal(sigpipe,sig_ign)忽略該訊號(只需一次)

其時send或recv函式將返回-1,errno為epipe,可視情況關閉socket或其他處理

gdb:

gdb預設收到sigpipe時中斷程式,可呼叫handle sigpipe nostop print

相關(1)sig_dfl訊號專用的預設動作:

(a)如果預設動作是暫停執行緒,則該執行緒的執行被暫時掛起。當執行緒暫停期間,傳送給執行緒的任何附加訊號都不交付,直到該執行緒開始執行,但是sigkill除外。

(b)把掛起訊號的訊號動作設定成sig_dfl,且其預設動作是忽略訊號 (sigchld)。

(2)sig_ign忽略訊號

(a)該訊號的交付對執行緒沒有影響

(b)系統不允許把sigkill或sigtop訊號的動作設定為sig_dfl

(3)指向函式的指標--捕獲訊號

(a)訊號一經交付,接收執行緒就在指定位址上執行訊號捕獲程式。在訊號捕 獲函式返回後,接受執行緒必須在被中斷點恢復執行。

(b)用c語言函式呼叫的方法進入訊號捕捉程式:

void func (signo)

int signo;

func( )是指定的訊號捕捉函式,signo是正被交付訊號的編碼

(c)如果sigfpe,sigill或sigsegv訊號不是由c標準定義的kill( )或raise( )函式所生成,則從訊號sigfpe,sigill,sigsegv的訊號捕獲函式正常返回後執行緒的行為是未定義的。

(d)系統不允許執行緒捕獲sigkill和sigstop訊號。

(e)如果執行緒為sigchld訊號建立訊號捕獲函式,而該執行緒有未被等待的以終止的子執行緒時,沒有規定是否要生成sigchld訊號來指明那個子執行緒。

每一種訊號都被oskit給予了乙個符號名,對於32位的i386平台而言,乙個字32位,因而訊號有32種。下面的表給出了常用的符號名、描述和它們的訊號值。

符號名  訊號值 描述                是否符合posix

sighup  1   在控制終端上檢測到結束通話或控制線程死亡  是

sigint  2   互動注意訊號              是

sigquit  3   互動中止訊號              是

sigill  4   檢測到非法硬體的指令          是

sigtrap  5   從陷阱中回朔              否

sigabrt  6   異常終止訊號              是

sigemt  7   emt 指令                否

sigfpe  8   不正確的算術操作訊號          是

sigkill  9   終止訊號                是

sigbus  10   匯流排錯誤                否

sigsegv  11   檢測到非法的記憶體呼叫          是

sigsys  12   系統call的錯誤引數           否

sigpipe  13   在無讀者的管道上寫           是

sigalrm  14   報時訊號                是

sigterm  15   終止訊號                是

sigurg  16   io通道緊急訊號             否

sigstop  17   暫停訊號                是

sigtstp  18   互動暫停訊號              是

sigcont  19   如果暫停則繼續             是

sigchld  20   子執行緒終止或暫停            是

sigttin  21   後台執行緒組一成員試圖從控制終端上讀出  是

sigttou  22   後台執行緒組的成員試圖寫到控制終端上   是

sigio   23   允許i/o訊號               否

sigxcpu  24   超出cpu時限               否

sigxfsz  25   超出檔案大小限制            否

sigvtalrm 26   虛時間警報器              否

sigprof  27   側面時間警報器             否

sigwinch 28   視窗大小的更改             否

siginfo  29   訊息請求                否

sigusr1  30   保留作為使用者自定義的訊號1        是

sigusr2  31   保留作為使用者自定義的訊號        是 

注意:linux訊號機制基本上是從unix系統中繼承過來的。早期unix系統中的訊號機制比較簡單和原始,後來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的訊號叫做"不可靠訊號",訊號值小於sigrtmin(red hat 7.2中,sigrtmin=32,sigrtmax=63)的訊號都是不可靠訊號。這就是"不可靠訊號"的**。它的主要問題是:程序每次處理訊號後,就將對訊號的響應設定為預設動作。在某些情況下,將導致對訊號的錯誤處理;因此,使用者如果不希望這樣的操作,那麼就要在訊號處理函式結尾再一次呼叫signal(),重新安裝該訊號。

**自http://www.lslnet.com/linux/docs/linux-3254.htm)  

關於socket通訊時SIGPIPE的問題

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

關於socket通訊時SIGPIPE的問題

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

EasyDSS因為系統時間導致的閃退分析及處理

近期我們測試easydss新版本時,出現啟動easydss.exe檔案閃退的問題,系統無法執行,下圖是通過cmd視窗保留的錯誤資訊。我們檢查可以發現在easydss的log目錄內沒有生成任何的data logs 日誌檔案,並且在kernel logs 目錄下面也沒有生成任何的日誌檔案。這就說明服務連...