我正在尝试 Linux Signals。我创建了一个如下场景:
- 最初使用 阻止所有
SIGINT
信号sigprocmask()
。 - 如果发送者发送
SIGUSR1
信号,则SIGINT
在进程生命周期的剩余时间内解除阻塞。
然而,第一步已成功实施,但无法使用 解锁(或更改)进程掩码sigprocmask()
。
我究竟做错了什么?
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
sigset_t block_list, unblock_list;
void sigint_handler(int sig)
{
printf("Ouch!!\n");
}
void sigusr1_handler(int sig)
{
sigemptyset(&unblock_list);
sigprocmask(SIG_SETMASK, &unblock_list, NULL);
}
int main(int argc, char **argv)
{
int count;
signal(SIGINT, &sigint_handler);
signal(SIGUSR1, &sigusr1_handler);
sigemptyset(&block_list);
sigaddset(&block_list, SIGINT);
sigprocmask(SIG_SETMASK, &block_list, NULL);
for(count=1; ;++count)
{
printf("Process id: %ld\t%d\n", (long)getpid(), count);
sleep(4);
}
exit(EXIT_SUCCESS);
}
$kill -n SIGINT <pid>
$kill -n SIGUSER1 <pid> //This call should unblock sigint_handler() for rest of the process life, but it is only unblocking for one time. Everytime I have call $kill -n SIGUSER1 <pid> to unblock SIGINT.
注意:为了简单起见,错误处理已被删除。
答案1
从信号处理程序返回后,内核将恢复信号掩码。这是由标准:
当线程的信号掩码在由 所安装的信号捕获函数中更改时
sigaction()
,从信号捕获函数返回时信号掩码的恢复会覆盖该更改(请参阅sigaction()
)。如果安装了信号捕获功能signal()
,则不确定是否会发生这种情况。
在Linux上,signal(2)
只是一个已弃用的兼容包装器sigaction(2)
,并且在使用时也会发生这种情况signal(2)
。