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在這個例程中使用 sigaction 函式為 sigusr1 和 sigusr2 訊號註冊了處理函式,然後從標準輸入讀入字元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 }
。程式執行後首先輸出自己的 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.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...