sigaction函式的使用

2021-09-22 21:58:13 字數 2654 閱讀 3764

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作(可同時兩種操作)。

他是posix的訊號介面,而signal()是標準c的訊號介面(如果程式必須在非posix系統上執行,那麼就應該使用這個介面)

給訊號signum設定新的訊號處理函式act, 同時保留該訊號原有的訊號處理函式oldact

int sigaction(int signo,const struct sigaction *restrict act,

struct sigaction *restrict oact);

結構sigaction定義如下:

struct sigaction;

sa_handler欄位包含乙個訊號捕捉函式的位址

sa_mask欄位說明了乙個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字復位為原先值。

sa_flag是乙個選項,主要理解兩個

sa_interrupt 由此訊號中斷的系統呼叫不會自動重啟

sa_restart 由此訊號中斷的系統呼叫會自動重啟

sa_siginfo 提供附加資訊,乙個指向siginfo結構的指標以及乙個指向程序上下文識別符號的指標

最後乙個引數是乙個替代的訊號處理程式,當設定sa_siginfo時才會用他。

例子:#include

#include

#include

void show_handler(int sig)

} int main(void)

} 注:

(1)    如果在訊號sigint(ctrl + c)的訊號處理函式show_handler執行過程中,本程序收到訊號sigquit(crt+\),將阻塞該訊號,直到show_handler執行結束才會處理訊號sigquit。

(2)    sa_nodefer       一般情況下, 當訊號處理函式執行時,核心將阻塞《該給定訊號 -- sigint>。但是如果設定了sa_nodefer標記, 那麼在該訊號處理函式執行時,核心將不會阻塞該訊號。 sa_nodefer是這個標記的正式的posix名字(還有乙個名字sa_nomask,為了軟體的可移植性,一般不用這個名字)    

sa_resethand    當呼叫訊號處理函式時,將訊號的處理函式重置為預設值。 sa_resethand是這個標記的正式的posix名字(還有乙個名字sa_oneshot,為了軟體的可移植性,一般不用這個名字)   

(3)    如果不需要重置該給定訊號的處理函式為預設值;並且不需要阻塞該給定訊號(無須設定sa_flags標誌),那麼必須將sa_flags清零,否則執行將會產生段錯誤。但是sa_flags清零後可能會造成訊號丟失!

sigaction(查詢或設定訊號處理方式)

相關函式 signal,sigprocmask,sigpending,

sigsuspend, sigemptyset

表頭檔案 #include

定義函式 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函式說明 sigaction()會依引數signum指定的訊號編號來設定該訊號的處理函式。引數signum可以指定sigkill和sigstop以外的所有訊號。

如引數結構sigaction定義如下

struct sigaction _u

sigset_t sa_mask;

unsigned long sa_flags;

void (*sa_restorer)(void);

} 訊號處理函式可以採用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底採用哪個要看sa_flags中是否設定了sa_siginfo位,如果設定了就採用void (*sa_sigaction)(int, siginfo_t *, void *),此時可以向處理函式傳送附加資訊;預設情況下採用void (*sa_handler)(int),此時只能向處理函式傳送訊號的數值。

sa_handler此引數和signal()的引數handler相同,代表新的訊號處理函式,其他意義請參考signal()。

sa_mask 用來設定在處理該訊號時暫時將sa_mask 指定的訊號擱置。

sa_restorer 此引數沒有使用。

sa_flags 用來設定訊號處理的其他相關操作,下列的數值可用。 

sa_falgs還可以設定其他標誌:

sa_resethand:當呼叫訊號處理函式時,將訊號的處理函式重置為預設值sig_dfl

··sa_restart:如果訊號中斷了程序的某個系統呼叫,則系統自動啟動該系統呼叫

sa_nodefer :一般情況下, 當訊號處理函式執行時,核心將阻塞該給定訊號。但是如果設定了 sa_nodefer標記, 那麼在該訊號處理函式執行時,核心將不會阻塞該訊號

sigaction#include

static void int_hander(int s)

int

main(void)

write(1, "\n", 1);

} sigaction(sigint, &oact, null); //恢復成原始狀態

return 0;

}

sigaction函式的使用

sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作 可同時兩種操作 他是posix的訊號介面,而signal 是標準c的訊號介面 如果程式必須在非posix系統上執行,那麼就應該使用這個介面 給訊號signum設定新的訊號處理函式act,同時保留該訊號原有的訊號處理函式oldact ...

sigaction函式使用例項

sigaction函式 1 sigaction函式原型 sigaction函式用來查詢和設定訊號處理方式,它是用來替換早期的signal函式。sigaction函式原型及說明如下 sigaction 查詢和設定訊號處理方式 所需標頭檔案 include 函式說明 sigaction 會依引數sign...

sigaction函式使用例項

sigaction函式 1 sigaction函式原型 sigaction函式用來查詢和設定訊號處理方式,它是用來替換早期的signal函式。sigaction函式原型及說明如下 sigaction 查詢和設定訊號處理方式 所需標頭檔案 include 函式說明 sigaction 會依引數sign...