1. 程式人生 > >Linux程序設定訊號遮蔽字

Linux程序設定訊號遮蔽字

#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呼叫檢視