利用sigpending,sigismember檢測信號是否被掛起

main.c

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>

void sighandler_new(int signo, siginfo_t *psiginfo, void *pReversed)
{
    sleep(1);
    printf("receive signal %d\n", signo);
}

int main(void)
{
    sigset_t sigset, oldsigset, pending_mask;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGINT);
    //sigprocmask函數設置全程阻塞
    if(-1 == sigprocmask(SIG_BLOCK, &sigset, &oldsigset))//把舊信號集合存起來,以便恢復原狀
    {
        perror("block SIGINT error");
        exit(-1);
    }

    struct sigaction act;
    act.sa_flags = SA_SIGINFO;
    act.sa_sigaction = sighandler_new;
    sigemptyset(&act.sa_mask);
    if(sigaction(SIGINT, &act, NULL))//註冊信號
    {
        printf("install SIGINT error\n");
    }
    sleep(10);

    if(-1 == sigpending(&pending_mask))//把掛起的信號集合放入pending_mask
    {
        perror("get pending mask error");
        exit(-1);
    }
    if(sigismember(&pending_mask, SIGINT))//檢測SIGINT信號是否被掛起了
    {
        printf("SIGINT is pending!\n");
    }
    //恢復舊信號集合,舊信號集合沒有阻塞,故之前掛起的信號會執行
    if(-1 == sigprocmask(SIG_SETMASK, &oldsigset, NULL))
    {
        perror("unblock signal error");
        exit(-1);
    }
    printf("signal unblocked !\n");
    sleep(10);
    return 0;
}

編譯與結果

結果

int sigpending(sigset_t *set);//將因阻塞掛起而暫未處理的信號集合由參數set指針返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章