部落格131 Linux 訊號集

2021-10-01 07:08:08 字數 1864 閱讀 4959

內容:記錄與訊號有關的知識哈

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...