我有这样一个信号处理程序:
void my_signal_handler(int signo )
{
sigset_t sa_mask;
sigsetemptyset(&sa_mask);
sigaddset(&sa_mask, SIGINT);
int res = pthread_sigmask(SIG_BLOCK, &sa_mask, NULL);
int i;
for(i=0;i<NUM_OF_THREADS;i++) {
pthread_kill(my_threads[i], SIGINT);
}
}
我用它来处理SIGINT。它必须在收到SIGINT时关闭其他线程。我试图阻止线程中的SIGINT不引起信号风暴。不幸的是,信号不会停止发送。我做错了什么?
答案 0 :(得分:1)
信号掩码是每线程的 - 如果你的其他线程还没有阻塞SIGINT
,当你在循环中发出信号时它们也会进入这个处理程序,并开始发送信号。 / p>
此外,线程信号被阻塞时到达的线程定向信号不会丢失 - 当线程解除阻塞信号时,它们会被传送。所以这里发生的是你的线程发送一个SIGINT
,它排队等待信号处理程序返回。此时,信号被解锁,允许传递信号,并重新输入处理程序。
您可以调用sigaction()
作为信号处理程序中的第一个操作来更改SIGINT
的信号处理程序,这将影响所有线程。