LINUX的signal

linux的信號來源
1.由一個進程發給另外一個進程(或自己)
2.內核發給進程

 

信號的特徵
異步的,分爲可靠信號和不可靠信號。

 

進程收到信號時怎麼處理
1.執行信號處理程序
2.若是收到信號時處在一個阻塞函數中,中斷當前系統調用並執行信號處理程序
3.若是想要信號處理程序後恢復被中斷的系統調用,須要設置SA_RESTART標誌,是否奏效依賴於不一樣的系統。

 

信號的三種處理方式
1.自定義處理動做,並經過signal或者sigaction將自定義信號處理函數和信號關聯起來。
2.設置信號的處理動做爲SIG_IGN來忽略它
3.設置信號的處理動做爲SIG_DFL,採用默認處理動做,默認處理動做通常是退出進程,也有的是產生core文件,還有的信號是忽略掉。
SIGKILL和SIGSTOP不能被捕捉,也不能被自定義處理和忽略處理。

 

信號處理程序會不會被信號打斷
1.posix容許咱們定義一組信號,當信號處理程序被調用時阻塞它們。任何阻塞的信號不能被遞交給進程,posix保證信號處理程序運行時被捕獲的信號是阻塞的。
2.linux保證信號處理程序不會被另外一個信號打斷

 

不可靠信號和可靠信號的差異
是否排隊,不可靠信號會把相同信號合併爲一個,而可靠信號會把收到的信號排隊。當信號產生的速度大於信號處理的速度,不可靠信號會丟失信號。

 

信號的應用
信號處理函數不要調用不可重入函數,好比標準庫的printf、malloc等,儘可能簡單點,不作實際工做,好比設置進程退出flag,合適退出交給線程和進程判斷flag並在合適時候退出。

 

慢系統調用須要處理的信號中斷錯誤
當一個慢系統調用被信號打斷時,會返回EINTR做爲返回值,這不是錯誤,須要再次調用該系統調用。
大多數網絡的阻塞調用:accept、read都屬於慢系統調用。
相關文章
相關標籤/搜索