在作業系統中,訊號是一種非同步的通知機制,用於通知程序發生了某種事件。當某個事件發生時,核心可以向程序傳送一個訊號,程序在接收到訊號後可以執行相應的處理操作。訊號可以用於處理各種情況,例如程序終止、使用者按下中斷鍵、某個子程序狀態改變等。
以下是訊號的一些重要特點和用法:
-
訊號的產生:訊號可以由硬體或軟體產生。硬體產生的訊號通常是由硬體異常(如除零錯誤、非法記憶體訪問等)引起的,而軟體產生的訊號可以透過系統呼叫(如
kill()
函式)或特定條件(如按下中斷鍵)引發。 -
訊號的處理:程序可以透過註冊訊號處理函式來捕獲和處理訊號。一旦程序接收到訊號,核心會呼叫註冊的訊號處理函式來執行相應的操作。可以使用
signal()
函式或sigaction()
函式來註冊訊號處理函式。 -
常見的訊號:UNIX系統定義了許多不同的訊號,每個訊號都有一個唯一的編號和一個對應的含義。例如,
SIGINT
是終端中斷訊號,通常由使用者按下Ctrl+C鍵引發;SIGSEGV
是段錯誤訊號,通常由非法記憶體訪問引發;SIGTERM
是終止訊號,通常用於請求程序正常終止等。 -
預設處理行為:對於每個訊號,系統都定義了一個預設的處理行為。例如,對於
SIGINT
訊號,預設的處理行為是終止程序;對於SIGTERM
訊號,預設的處理行為是正常終止程序。 -
訊號的傳送:程序可以透過
kill()
函式向其他程序或自身傳送訊號。傳送訊號時需要指定目標程序的程序ID(PID)和訊號編號。 -
訊號的阻塞和解除阻塞:程序可以選擇阻塞某些訊號,使其在阻塞狀態下暫時不被處理。透過呼叫
sigprocmask()
函式可以設定訊號遮蔽字來控制哪些訊號被阻塞,以及在什麼情況下解除對訊號的阻塞。
訊號是UNIX系統中一種重要的程序間通訊機制,它提供了一種靈活的方式來處理各種非同步事件,並允許程序對這些事件進行響應和處理。在編寫UNIX程式時,合理地處理訊號是非常重要的一部分,可以提高程式的健壯性和可靠性。