Linux系統中的訊號

2021-06-10 00:16:18 字數 2098 閱讀 4824

訊號(signal)是linux系統中用於程序之間相互通訊或操作的一種機制。訊號是乙個相當廣泛的課題;在這裡,我們僅僅**幾種最重要的訊號以及利用訊號控制程序的技術。

訊號是乙個傳送到程序的特殊資訊。訊號機制是非同步的;當乙個程序接收到乙個訊號時,它會立刻處理這個訊號,而不會等待當前函式甚至當前一行**結束執行。訊號有幾十種,分別代表著不同的意義。訊號之間依靠它們的值來區分,但是通常在程式中使用訊號的名字來表示乙個訊號。在linux系統中,這些訊號和以它們的名稱命名的常量均定義在/usr/include/bits/signum.h檔案中。(通常程式中不需要直接包含這個標頭檔案,而應該包含。)

當乙個程序接收到訊號,基於不同的處理方式(disposition),該程序可能執行幾種不同操作中的一種。每個訊號都有乙個預設處理方式(default disposition),當程序沒有指定自己對於某個訊號的處理方式的時候,預設處理方式將被用於對對應訊號作出響應。對於多數種類的訊號,程式都可以自由指定乙個處理方式——程式可以選擇忽略這個訊號,或者呼叫乙個特定的訊號處理函式。如果指定了乙個訊號處理函式,當前程式會暫停當前的執行過程,同時開始執行訊號處理函式,並且當訊號處理函式返回之後再從被暫停處繼續執行。

linux系統在執行中出現特殊狀況的時候也會向程序傳送訊號通知。例如,當乙個程序執行非法操作的時候可能會收到sigbus(主線錯誤),sigsegv(段溢位錯誤)及sigfpe(浮點異常)這些訊號。這些訊號的預設處理方式都是終止程式並且產生乙個核心轉儲檔案(core file)。

乙個程序除了響應系統發來的訊號,還可以向其它程序傳送訊號。對於這種機制的乙個最常見的應用就是通過傳送sigterm或sigkill訊號來結束其它程序。3#3 除此之外,它還常見於向執行中的程序傳送命令。兩個「使用者自定義」的訊號sigusr1和sigusr2就是專門作此用途的。sighup訊號有時也用於這個目的——通常用於喚醒乙個處於等待狀態的程序或者使程序重新讀取配置檔案。

系統呼叫sigaction用於指定訊號的處理方式。函式的第乙個引數是訊號的值。之後兩個引數是兩個指向sigaction結構的指標;第乙個指向了將被設定的處理方式,第二個用於儲存先前的處理方式。這兩個sigaction結構中最重要的都是sa_handler域。它可以是下面三個值:

·sig_dfl,指定預設的訊號處理方式 

·sig_ign,指定該訊號將被忽略 

· 乙個指向訊號處理函式的指標。這個函式應該接受訊號值作為唯一引數,且沒有返回值。 

因為訊號處理是非同步進行的,當訊號處理函式被呼叫的時候,主程式可能處在非常脆弱的狀態,並且這個狀態會一直保持到訊號處理函式結束。因此,應該盡量避免在訊號處理函式中使用輸入輸出功能、絕大多數庫函式和系統呼叫。

訊號處理函式應該做盡可能少的工作以響應訊號的到達,然後返回到主程式中繼續執行(或者結束程序)。多數情況下,所進行的工作只是記錄訊號的到達。而主程式則定期檢查是否有訊號到達,並且針對當時情況作出相應的處理。

訊號處理函式也可能被其它訊號的到達所打斷。雖然這種情況聽起來非常罕見,一旦出現,程式將非常難以確定問題並進行除錯。甚至於對全域性變數賦值可能也是不安全的,因為乙個賦值操作可能由兩個或更多機器指令完成,而在這些指令執行期間可能會有第二個訊號到達,致使被修改的全域性變數處於不完整的狀態。如果你需要從訊號處理函式中設定全域性標誌以記錄訊號的到達,這個標誌必須是特殊型別sig_atomic_t的例項。linux保證對於這個型別變數的賦值操作只需要一條機器指令,因此不用擔心可能在中途被打斷。在linux系統中,sig_atomic_t就是基本的int型別;事實上,對int或者更小的整型變數以及指標賦值的操作都是原子操作。不過,如果你希望所寫的程式可以向任何標準unix系統移植,則應將所有全域性變數設為sig_atomic_t型別。

如下所示,**列表3.5中的簡單程式中,我們利用訊號處理函式統計程式在執行期接收到sigusr1訊號的次數。sigusr1訊號是乙個為應用程式保留的訊號。

**列表3.5 (sigusr1.c)使用訊號處理函式

#include

#include

#include

#include

#include

sig_atomic_t sigusr1_count = 0; 

void handle (int signal_number) 

int main () 

本文**    紅聯   w397090770的專欄

linux系統中定義的訊號

linux系統中定義得訊號可以通過kill l命令檢視,共定義了64個訊號。signaldescription sigabrt 由呼叫abort函式產生,程序非正常退出 sigalrm 用alarm函式設定的timer超時或setitimer函式設定的interval timer超時 sigbus ...

Linux系統 訊號

訊號的基本概念 為了理解訊號,先從我們最熟悉的場景說起。使用者輸入命令,在shell下啟動乙個前台程序。使用者按下ctrl c,這個鍵盤輸入產生乙個硬體中斷。如果cpu當前正在執行這個程序的 則該程序的使用者空間 暫停執行,cpu從使用者態切換到核心態處理硬體中斷。中斷驅動程式將ctrl c解釋成乙...

linux中的訊號

1.什麼是訊號 1.1 訊號是內容受限的一種非同步通訊機制 1 訊號的目的 用來通訊 2 訊號是非同步的 對比硬體中斷 3 訊號本質上是int型數字編號 事先定義好的 1.2 訊號由誰發出 1 使用者在終端按下按鍵 2 硬體異常後由作業系統核心發出訊號 3 使用者使用kill命令向其他程序發出訊號 ...