天天看點

【Unix環境進階程式設計】sigprocmask函數與sigpending函數

sigprocmask函數:

功能描述:

設定對信号屏蔽集内的信号的處理方式(阻塞或不阻塞)。

用法:

#include <signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

NOTE: If oldset is non-null, the previous value of the signal mask is stored in oldset.

參數:

how:用于指定信号修改的方式,可能選擇有三種

SIG_BLOCK //加入信号到程序屏蔽。

SIG_UNBLOCK //從程序屏蔽裡将信号删除。

SIG_SETMASK //将set的值設定為新的程序屏蔽。

相應函數指令:

sigset_t set

sigemptyset(&set) :清空阻塞信号集合變量

sigfillset(&set) :添加所有的信号到阻塞集合變量裡

sigaddset(&set,SIGINT):添加單一信号到阻塞信号集合變量

sigdelset(&set,SIGINT):從阻塞信号集合變量中删除單一信号

sigismember(&set,int signum):這個函數測試信号signum是否包含在信号集合set中,如果包含傳回1,不包含傳回0,出錯傳回-1。錯誤代碼也隻有一個EINVAL,表示signum不是有效的信号代碼。

sigpending 函數:

功能:傳回在阻塞期間接收到阻塞信号的集合。

#include"apue.h"
static void sig_quit(int);

int main(void)
{
    sigset_t newmask,oldmask,pendmask;
    if(signal(SIGQUIT,sig_quit)==SIG_ERR)
        err_sys("cant catch SIGQUIT");//對SIGQUIT阻塞,儲存目前信号屏蔽字
           
sigemptyset(&newmask);
    sigaddset(&newmask,SIGQUIT);
    if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
        err_sys("SIG_BLOCK error");

    sleep(5);//SIGQUIT目前還是未決狀态

    if(sigpending(&pendmask)<0)
        err_sys("sigpending error");
    if(sigismember(&pendmask,SIGQUIT))
        printf("\nSIGQUIT pending\n");

    if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
        err_sys("SIG_SETMASK error");
    printf("SIGQUIT unblocked\n");
    sleep(5);//SIGQUIT will terminate with core file
    exit(0);
}
static void sig_quit(int signo)
{
    printf("caught SIGQUIT\n");
    if(signal(SIGQUIT,SIG_DFL)==SIG_ERR)
    {
        err_sys("cant reset SIGQUIT");
    }
}

           

在休眠期間如果産生了退出信号,此時該信号是未決的,但是不再阻塞。

然後該程序再休眠五秒,此期間在産生退出信号,此時信号處理方式為預設動作,這一次會是程序終止。

【Unix環境進階程式設計】sigprocmask函數與sigpending函數

繼續閱讀