0

我有这样一个信号处理程序:

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 不引起信号风暴。不幸的是,信号不会停止发送。我做错了什么?

4

1 回答 1

1

信号掩码是每个线程的 - 如果您的其他线程尚未SIGINT阻塞,当您在循环中向它们发出信号时,它们也会进入此处理程序,并开始发送信号。

此外,在线程阻塞信号时到达的线程定向信号不会丢失 - 它们在线程解除阻塞信号时传递。所以这里发生的事情是你的线程向自己发送 a SIGINT,它在信号处理程序返回之前排队。此时,信号被解除阻塞,从而允许传递信号,并重新进入处理程序。

您可以调用sigaction()信号处理程序中的第一个操作来更改 的信号处理程序SIGINT,这将影响所有线程。

于 2013-11-06T04:08:16.773 回答