阻止和解除阻塞SIGINT和SIGQUIT

时间:2017-11-01 16:40:37

标签: c linux signals

我正在编写一个程序,它有两个for循环和第一个for循环(只打印1-5并在其间休眠1秒)SIGINT和SIGQUIT将被阻止,而在第二个for循环中只有SIGINT是受阻。我成功阻止了第一个for循环的正确信号,然后在第二个for循环中,我尝试删除SIGQUIT被阻止但两个信号似乎仍然被阻止。

以下是我现在的情况:

#include <unistd.h>
#include <stdio.h>
#include <wait.h>
#include <signal.h>
#include <string.h>


void hd1(int sig){
    if(sig == SIGINT){
        printf(" SIGINT Recieved\n");
    }else if(sig == SIGQUIT){
        printf(" SIGQUIT Recieved\n");
    }
}


int main(){
    sigset_t new_set;
    sigset_t old_set;

    //struct sigaction act;
    //memset(&act, 0, sizeof(act));

    //act.sa_handler = hd1;

    //sigaction(SIGINT, &act, 0);
    //sigaction(SIGQUIT, &act, 0);

    sigemptyset(&new_set);
    sigaddset(&new_set, SIGINT);
    sigaddset(&new_set, SIGQUIT);

    sigprocmask(SIG_BLOCK, &new_set, &old_set);

    for(int i = 1; i <= 5; i++){
        printf("%d\n", i);
        sleep(1);
    }


    sigdelset(&new_set, SIGQUIT);


    for(int i = 1; i <= 5; i++){
        printf("%d\n", i);
        sleep(1);
    }
}

我尝试使用sigprocmask取消阻止并设置掩码以重置掩码,但是当我取消阻塞信号时它会在循环后终止程序。

1 个答案:

答案 0 :(得分:2)

再次使用sigprocmask();。并使用SIG_SETMASK

  

SIG_SETMASK   阻塞信号集被设置为参数集。

sigdelset(&new_set, SIGQUIT);
sigprocmask(SIG_SETMASK, &new_set, NULL);