sigaction函式的功能是檢查或修改與指定訊號相關聯的處理動作(可同時兩種操作)。
他是posix的訊號介面,而signal()是標準c的訊號介面(如果程式必須在非posix系統上執行,那麼就應該使用這個介面)
給訊號signum設定新的訊號處理函式act, 同時保留該訊號原有的訊號處理函式oldact
intsigaction
(int signo,
const
struct
sigaction
*restrict act,
struct
sigaction
*restrict oact)
;結構sigaction定義如下:
struct
sigaction
;sa_handler欄位包含乙個訊號捕捉函式的位址
sa_mask欄位說明了乙個訊號集,在呼叫該訊號捕捉函式之前,這一訊號集要加進程式的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字復位為原先值。
sa_flag是乙個選項,主要理解兩個
sa_nodefer: 當訊號處理函式正在進行時,不堵塞對於訊號處理函式自身訊號功能。
sa_resethand: 當使用者註冊的訊號處理函式被執行過一次後,該訊號的處理函式被設為系統預設的處理函式
sa_siginfo 提供附加資訊,乙個指向siginfo結構的指標以及乙個指向程序上下文識別符號的指標
最後乙個引數是乙個替代的訊號處理程式,當設定sa_siginfo時才會用他。
例子:#include
#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函式解析
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 ...