sigaction函式詳解

2021-09-30 04:21:54 字數 1501 閱讀 3083

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 清零後可能會造成訊號丟失!

另外:

sigchld屬於unix以及類unix系統的一種訊號

sigaction函式解析

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

sigaction函式解析

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

sigaction函式解析

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