[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 )
留言
張貼留言