信号的转存,进程的挂起/激活(一)

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

void sig_int(int signo) {
    printf("got signal:%d\n", signo);
}

int main(void) {
    printf("\nprogram start\n");


    sigset_t sig_usr2, sig_usr1;

    signal(SIGUSR1, sig_int);
    signal(SIGUSR2, sig_int);

    sigemptyset(&sig_usr1);
    sigaddset(&sig_usr1, SIGUSR1);
    sigemptyset(&sig_usr2);
    sigaddset(&sig_usr2, SIGUSR2);

    if (sigprocmask(SIG_BLOCK, &sig_usr1, NULL) < 0) { //开始拦截信号usr1
        perror("sigprocmask");
        return -1;
    }

    printf("in critical region\n");

    pause();

    printf("out critical region\n");

    if (sigprocmask(SIG_UNBLOCK, &sig_usr1, NULL) < 0) { //取出拦截到的usr1信号并触发
        perror("sigprocmask");
        return -1;
    }


    printf("program exit\n");
    return 0;
}

运行:

[mofan@localhost Debug]$ ./a.out &
[1] 57595
[mofan@localhost Debug]$
program start
in critical region
[mofan@localhost Debug]$ kill -USR1 57595
[mofan@localhost Debug]$ kill -USR1 57595
[mofan@localhost Debug]$ kill -USR2 57595
got signal:12
out critical region
got signal:10
program exit
posted @ 2017-03-09 18:04  mofanyam  阅读(358)  评论(0编辑  收藏  举报