Linux程序設定訊號遮蔽字
阿新 • • 發佈:2018-12-31
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
int main()
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGINT);
sigprocmask(SIG_BLOCK,&set,NULL);
while(1)
{
printf("hello world!\n");
sleep(1);
}
return 0;
}
linux的訊號狀態有兩個集合 ,一個是未決訊號集,一個是阻塞訊號集合,若對應的訊號在阻塞訊號集中為1 ,此時收到該訊號,未決訊號的訊號集會被製為1,由於阻塞訊號集為1所以該訊號會被阻塞,暫時無法處理。未決訊號集只有kernel 能操作,使用者只有讀取許可權,因此我們可以通過函式int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);來設定阻塞訊號集。執行上面程式你將發現無法通過control+c來終止程序。這是由於SIGINT在阻塞訊號集中的狀態為1導致的。需要注意的是SIGKILL和SIGSTOP無法阻塞。
最後附上對訊號集sigset_t的幾個操作函式
int sigemptyset(sigset_t *set)
int sigfillset(sigset_t *set)
int sigaddset(sigset_t *set,int signo)
int sigdelset(sigset_t *set,int signo)
int sigismember(const sigset_t *set,int signo)
對於未決訊號集可以通過int sigpending(sigset_t *set)函式檢視。跟多具體用法使用者可以通過man呼叫檢視