訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。
訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset_t。
與訊號集設定相關的函式有如下幾個:
[cpp]view plain
copy
"font-size:18px;"
>#include
/** 下列四個函式成功返回0,出錯返回-1
*/int
sigemptyset(sigset_t *set);
intsigfillset(sigset_t *set);
intsigaddset(sigset_t *set,
intsigno);
intsigdelset(sigset_t *set,
intsigno);
/** 下面函式若真返回1,若假返回0,出錯返回-1
*/int
sigismember(
const
sigset_t *set,
intsigno);
要注意的是,所有應用程式在使用訊號集前,要對訊號集呼叫sigemptyset或sigfillset一次。這是因為c編譯器把未賦初值的外部和靜態變數都初始化為0,而這是否與給定的訊號集實現對應卻並不清楚。
設定訊號遮蔽字則要呼叫下面函式:
[cpp]view plain
copy
"font-size:18px;"
>#include
intsigprocmask(
inthow,
const
sigset_t *restrict set, sigset_t *restrict oset);
how取值有下列三個:
sig_block :set中包含的是希望阻塞的附加訊號
sig_unblock:set中包含的是希望解除阻塞的訊號
sig_setmask:set中包含的是現有遮蔽字的代替值
若oset是非空指標,則返回程序的當前訊號遮蔽字。
若set為空,則程序訊號遮蔽字不變,how值無意義。
另外,注意一點,不可以阻塞sigkill和sigstop訊號。
要想處理關於訊號遮蔽字的問題,還需要乙個函式,就是sigpending,原型如下:
[cpp]view plain
copy
"font-size:18px;"
>#include
intsigpending(sigset_t *set);
此函式通過set返回當前正在阻塞的訊號的訊號集。
下面通過乙個例項理解一下這幾個函式的用法:
[cpp]view plain
copy
"font-size:18px;"
>#include
#include
#include
#include
static
void
sig_quit(
int);
static
void
err_quit(
const
char
*str)
intmain(
void
)
static
void
sig_quit(
intsigno)
在ubuntu12.04下執行結果如下
[unix]$ ./a.out
^\^\^\^\^\^\^\^\^\^\
sigquit pending
caught sigquit
sigquit unblocked
^\退出 (核心已轉儲)
上面十個訊號只有乙個輸出是因為sigquit是不可靠訊號,系統沒有對其進行排隊。
**:
linux訊號集與訊號遮蔽字
訊號傳遞過程 一些名詞 需要注意的是 這些變數之間也存在一些關係,比如 程序將訊號遮蔽字的2號為置為1,也就是說遮蔽sigint訊號,那麼但你向程序傳送該訊號時 ctrl c 該訊號必然處於未決狀態。那麼,訊號未決狀態字的2號位自然也就是1啦。訊號集操作函式 posix.1 定義了乙個資料型別sig...
設定訊號集和訊號遮蔽字
訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。include 下列四個函式成功返回0,出錯返回 1 int sigemptyset sigset t set int sigfillset sigset t set ...
Linux Signal 6 訊號遮蔽字
1.概念 訊號遮蔽字就是程序中被阻塞的訊號集,這些訊號不能傳送給該程序,它們在該程序中被 遮蔽 了.後面我們會提到,實際上它們是被阻塞了.2.訊號遮蔽函式 include signal.h intsigprocmask inthow,const sigset t restrict set,sigse...