linux-信号处理函数-解除系统信号阻塞

2020-03-29  本文已影响0人  诸事圆成

下面是我写了个即使按了Ctrl C进程也不会退出的例子

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>


sigset_t prev_mask;

static char *SIG_NAME[] =
{"SIGHUP",
 "SIGINT",
 "SIGQUIT"
};

/* 设置收到Ctrol C 进程不退出*/
static void setUNBlock()
{
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);

    sigprocmask(SIG_BLOCK, &mask, &prev_mask);
}

/* 还原系统设置 */
static void restore_system_block(sigset_t *set)
{
   sigprocmask(SIG_SETMASK, set, NULL);
}

/* signal处理函数 */
static void signal_hander(int _N)
{
    printf("Caught signal: %s\n", SIG_NAME[_N - 1]);
    exit(EXIT_SUCCESS);
}


int main(int argc, char **argv)
{
    //注册收到Ctrl C的处理函数 signal_hander()
    if (signal(SIGINT, signal_hander) == SIG_ERR)
    {
        printf("signal_error\n");
        exit(EXIT_FAILURE);
    }
    
    setUNBlock();
    int i = 0;
    while(i < 10)
    {
        printf("process is sleep...\n");
        sleep(1);
        i++;
    }
    printf("_______________process is restored\n");
    restore_system_block(&prev_mask);
    
    while(1);

    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读