linux 程序訊號

2022-06-23 06:18:10 字數 1973 閱讀 4257

signal 函式的使用方法簡單,但並不屬於 posix 標準,在各類 unix 平台上的實現不盡相同,因此其用途受

到了一定的限制。而 posix 標準定義的訊號處理介面是 sigaction 函式,其介面標頭檔案及原型如下:

#include

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

◆ signum:要操作的訊號。

◆ act:要設定的對訊號的新處理方式。

◆ oldact:原來對訊號的處理方式。

◆ 返回值:0 表示成功,-1 表示有錯誤發生。

struct sigaction 型別用來描述對訊號的處理,定義如下:

struct sigaction

;在這個結構體中,成員 sa_handler 是乙個函式指標,其含義與 signal 函式中的訊號處理函式類似。成員

sa_sigaction 則是另乙個訊號處理函式,它有三個引數,可以獲得關於訊號的更詳細的資訊。當 sa_flags 成員的值

包含了 sa_siginfo 標誌時,系統將使用 sa_sigaction 函式作為訊號處理函式,否則使用 sa_handler 作為訊號處理

函式。在某些系統中,成員 sa_handler 與 sa_sigaction 被放在聯合體中,因此使用時不要同時設定。

sa_mask 成員用來指定在訊號處理函式執行期間需要被遮蔽的訊號,特別是當某個訊號被處理時,它自身會被

自動放入程序的訊號掩碼,因此在訊號處理函式執行期間這個訊號不會再度發生。

sa_flags 成員用於指定訊號處理的行為,它可以是一下值的「按位或」組合。

◆ sa_restart:使被訊號打斷的系統呼叫自動重新發起。

◆ sa_nocldstop:使父程序在它的子程序暫停或繼續執行時不會收到 sigchld 訊號。

◆ sa_nocldwait:使父程序在它的子程序退出時不會收到 sigchld 訊號,這時子程序如果退出也不會成為僵

屍程序。

◆ sa_nodefer:使對訊號的遮蔽無效,即在訊號處理函式執行期間仍能發出這個訊號。

◆ sa_resethand:訊號處理之後重新設定為預設的處理方式。

◆ sa_siginfo:使用 sa_sigaction 成員而不是 sa_handler 作為訊號處理函式。

re_restorer 成員則是乙個已經廢棄的資料域,不要使用。

下面用乙個例程來說明 sigaction 函式的使用,**如下:

1 #include 2 #include 3 #include 4 #include 5

6static

void sig_usr(int

signum)712

else

if(signum ==sigusr2)

1316

else

1720}21

22int main(void)23

43}44else

4549}50

51return0;

52 }

在這個例程中使用 sigaction 函式為 sigusr1 和 sigusr2 訊號註冊了處理函式,然後從標準輸入讀入字元

。程式執行後首先輸出自己的 pid,如:

my pid is 5904

這時如果從另外乙個終端向程序傳送 sigusr1 或 sigusr2 訊號,用類似如下的命令:

kill -usr1 5904

則程式將繼續輸出如下內容:

sigusr1 received

read is interrupted by signal

這說明用 sigaction 註冊訊號處理函式時,不會自動重新發起被訊號打斷的系統呼叫。如果需要自動重新發

起,則要設定 sa_restart 標誌,比如在上述例程中可以進行類似一下的設定:

sa_usr.sa_flags = sa_restart;

Linux 程序訊號

概念 訊號是程序之間事件非同步通知的一種方式,屬於軟中斷。訊號處理常見方式 忽略此訊號。執行該訊號的預設處理動作。提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉 catch 乙個訊號。產生訊號 捕捉訊號 核心如何實現訊號的捕捉 如果訊號的處理動作是使用者...

Linux程序訊號

訊號是乙個軟體中斷。作業系統通過訊號告訴程序發生了某個事件,打斷程序當前的操作,去處理這個事件。1.訊號的檢視kill l 檢視系統中的訊號種類在linux作業系統中,一共有62中訊號。34 64號訊號 後期擴充的,因為沒有具體對應事件,因此命名比較草率 可靠訊號。訊號的生命週期 產生 在程序中註冊...

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...