by:
潘雲登
對於商業目的下對本文的任何行為需經作者同意。
寫在前面
1.本文內容對應《
unix
環境高階程式設計》(第
2版)》第
10章。 2.
總結了sigaction
函式的用法,用以替代先前捕捉訊號使用的
signal
函式。 3.
sigaction
前面學習過
signal
函式,使用它為某個特定訊號指定乙個訊號處理函式,即可捕捉該訊號。但是,如果希望在處理訊號的同時,指定額外的訊號遮蔽字,或者更自由地控制訊號處理函式的行為,或者需要獲取訊號產生的原因,那麼應該使用更為強大的
sigaction
函式。
#include
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
其中,引數
signo
是要檢查或修改其具體動作的訊號編號。若
act指標非空,則要修改其動作。若
oact
指標非空,則系統經由
oact
指標返回該訊號的上乙個動作。一旦對給定的訊號設定了乙個動作,那麼在呼叫
sigaction
顯式地改變它之前,該設定就一直有效。
struct sigaction ;
當更改訊號動作時,如果
sa_handler
字段包含乙個訊號處理函式的位址,則
sa_mask
字段說明了乙個訊號集,在呼叫該訊號處理函式之前,這一訊號集要加到程序的訊號遮蔽字中。僅當從訊號處理函式返回時再將程序的訊號遮蔽字復位為原先值。這樣,在呼叫訊號處理函式時就能阻塞某些訊號。在訊號處理函式被呼叫時,作業系統建立的新訊號遮蔽字包括正被遞送的訊號。
act結構的sa_flags
字段指定對訊號進行處理的各個選項: l
sa_interrupt
:由訊號中斷的系統呼叫不會自動重啟,這是預設處理方式。 l
sa_restart
:由此訊號中斷的系統呼叫會自動重啟動。 l
sa_nocldstop
:若signo
是sigchld
,當子程序停止或繼續時不產生此訊號。當子程序終止時,產生此訊號。 l
sa_nocldwait
:若signo
是sigchld
,則當呼叫程序的子程序終止時,不建立僵死程序。若程序在後面呼叫
wait
,則呼叫程序阻塞,直到其所有子程序終止,此時返回
-1,並設定
errno
為echild。
lsa_nodefer
:當捕捉到此訊號時,在執行其訊號處理函式時,系統不自動遮蔽此訊號。 l
sa_resethand
:在此訊號處理函式的入口處,將此訊號的處理方式復位為
sig_dfl
,並清除
sa_siginfo
標誌。
lsa_siginfo
:此選項對訊號處理函式提供附加資訊。
sa_sigaction
欄位是乙個替代的訊號處理函式,當在
sigaction
結構中使用了
sa_siginfo
標誌時,使用該訊號處理函式。它按下列方式呼叫:
void handler(int signo, siginfo_t *info, void *context);
其中,siginfo_t
結構包含了訊號產生原因的有關資訊。
context
引數是無型別指標,可被強制轉換為
ucntext_t
結構型別,用於標識訊號傳遞時程序的上下文。
實驗程式如下:
#include "apue.h"
#include
static void sig_chld(int signo)
int main()
執行結果為:
pydeng@pydeng-laptop:~/apue.2e/mytest$ ./a.out
sigchld is blocked.
in sig_chld: sigint
wait error: no child processes
APUE學習筆記 10 訊號概念
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 10章。2.總結了有關訊號的基本概念,包括訊號產生的原因和對訊號的處理方式。3.訊號概念 訊號是軟體中斷,提供了一種處理非同步事件的方法。每個訊號都有乙個名字,以字元 si...
APUE學習 訊號(3)
1 訊號集 本篇檔案介紹訊號集的概念。訊號集就是一些訊號的集合,型別是sigset t,這個型別是不透明的,當然可以找到標頭檔案仔細研究但意義不大。該型別所涉及的操作函式如下 cpp view plain copy intsigemptyset sigset t set 初始化訊號集set為空,不包...
APUE學習筆記 17 執行緒和訊號
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。3.執行緒的訊號遮蔽字 每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒...