在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 目錄下面也沒有生成任何的日誌檔案。這就說明服務連...