我正在编写一个程序,它有两个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
取消阻止并设置掩码以重置掩码,但是当我取消阻塞信号时它会在循环后终止程序。
答案 0 :(得分:2)
再次使用sigprocmask();
。并使用SIG_SETMASK
SIG_SETMASK 阻塞信号集被设置为参数集。
sigdelset(&new_set, SIGQUIT);
sigprocmask(SIG_SETMASK, &new_set, NULL);