[linux]SIGPIPE handle



在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

留言

這個網誌中的熱門文章

[c#] 程式資料的設定與config

[黃金] 黃金存摺Start