內容:記錄與訊號有關的知識哈
1.檢視linux訊號集:
編號為 1
~31 的訊號為傳統 unix 支援的訊號,是非實時訊號,編號為 32
~63 的訊號是後來擴充的,
稱做可實時訊號。區別在於前者不支援排隊,也就是排隊了幾個都當乙個處理,可能會造成訊號丟失,而後者
不會。非可靠訊號一般都有確定的用途及含義, 可靠訊號則可以讓使用者自定義使用。
注意:上面並沒有列出32號訊號和33號訊號,這兩個訊號(sigcancel 和 sigsetxid)被執行緒庫徵用了,用來實現
執行緒的取消。從核心層來說,32號訊號應該是最小的實時訊號(sigrtmin)
,但是由於32號和33號被glibc
內部徵用了,所以將sigrtmin設定成了34號訊號
常見訊號及其解釋:
sigint :程式終止( interrupt )訊號, 在使用者鍵入 ctrl + c 時發出,用於通知前台程序組終止程序。
(與kill -
9 不一樣哦!)
sigabrt :呼叫 abort 函式生成的訊號。
sigbus :非法位址, 包括記憶體位址對齊( alignment )出錯。比如訪問乙個四個字長的整數, 但其位址不
是 4 的倍數。它與 sigse** 的區別在於後者是由於對合法儲存位址的非法訪問觸發(如訪問唯讀儲存空間)。
sigfpe : 在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢位及除數為0等其它所有
的算術的錯誤。
sigkill :用來立即結束程式的執行。本訊號不能被阻塞、處理和忽略。如果發現某個程序終止不了,可嘗試
傳送這個訊號。
sigusr1 : 留給使用者使用
sigusr2 : 留給使用者使用
sigpipe :這個訊號通常在程序間通訊產生,比如採用 fifo (管道)通訊的兩個程序,讀管道沒開啟或者
意外終止就往管道寫,寫程序會收到 sigpipe 訊號。此外用socket 通訊的兩個程序,寫程序在寫socket
的時候,讀程序已經終止。寫服務的的同學應該都很清楚這個訊號,一般都是要處理掉的,否則服務端有可能
意外的終止
sigterm :程式結束( terminate )訊號, 與 sigkill 不同的是該訊號可以被阻塞和處理。通常用來使
程式自己正常退出,shell 命令 kill 預設產生這個訊號。如果程序終止不了,我們才會嘗試 sigkill。
sigchld :子程序結束時, 父程序會收到這個訊號。
(如果父程序沒有處理這個訊號,也沒有等待( wait )子程序,子程序雖然終止,但是還會在核心程序表
中占有表項,這時的子程序稱為殭屍程序。這種情況我們應該避免(父程序或者忽略 sigchild 訊號,或者
捕捉它,或者 wait 它派生的子程序,或者父程序先終止,這時子程序的終止自動由 init 程序來接管)
sigstop :停止( stopped )程序的執行。注意它和 terminate 以及 interrupt 的區別:該程序還未
結束, 只是暫停執行。本訊號不能被阻塞,處理或忽略。
sigtstp :停止程序的執行, 但該訊號可以被處理和忽略。使用者鍵入 susp 字元時(通常是 ctrl + z )
發出這個訊號。
sigurg :有「緊急」資料或 out-of-band 資料到達 socket 時產生。
sigsys :非法的系統呼叫。
linux 訊號集操作
訊號掩碼 被阻塞的訊號集 每個程序都有乙個用來描述哪些訊號傳送來將被阻塞的訊號集,如果某種訊號在某個程序的阻塞訊號集中,則傳送到該程序的此種訊號將會被阻塞。當前被程序阻塞的訊號集也叫訊號掩碼,型別為sigset t。每個程序都有自己的訊號掩碼,且建立子程序時,子程序會繼承父程序的訊號掩碼。訊號阻塞和...
linux訊號集與訊號遮蔽字
訊號傳遞過程 一些名詞 需要注意的是 這些變數之間也存在一些關係,比如 程序將訊號遮蔽字的2號為置為1,也就是說遮蔽sigint訊號,那麼但你向程序傳送該訊號時 ctrl c 該訊號必然處於未決狀態。那麼,訊號未決狀態字的2號位自然也就是1啦。訊號集操作函式 posix.1 定義了乙個資料型別sig...
linux訊號通訊 訊號集函式組
訊號處理的方法主要有兩種,一種是使用signal 函式,另一種是使用訊號集函式組。例項 include include include 自定義的訊號處理函式 void my func int sign no if sign no sigquit int main 將相應的訊號加入訊號集 if sig...