訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。
訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset_t。
#include /*
* 下列四個函式成功返回0,出錯返回-1
*/int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
/* * 下面函式若真返回1,若假返回0,出錯返回-1
*/int sigismember(const sigset_t *set, int signo);
要注意的是,所有應用程式在使用訊號集前,要對訊號集呼叫sigemptyset或sigfillset一次。這是因為c編譯器把未賦初值的外部和靜態變數都初始化為0,而這是否與給定的訊號集實現對應卻並不清楚。
設定訊號遮蔽字則要呼叫下面函式:
#include int sigprocmask(int how, 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,原型如下:
#include int sigpending(sigset_t *set);
此函式通過set返回當前正在阻塞的訊號的訊號集。
下面通過乙個例項理解一下這幾個函式的用法:
#include #include #include #include static void sig_quit(int);
static void err_quit(const char *str)
int main(void)
static void sig_quit(int signo)
在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。與訊號集設定相關的函式有如下幾個 cpp view plain copy font size 18px include 下列四個函式成功返回0,出錯返回 1 int s...
alarm(設定訊號傳送鬧鐘)
alarm 設定訊號傳送鬧鐘 相關函式 signal,sleep 表頭檔案 include 定義函式 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前的程序。如果引數seco...