gpt4 book ai didi

c - pthread_sigmask 在信号处理程序中不起作用

转载 作者:行者123 更新时间:2023-11-30 15:43:40 25 4
gpt4 key购买 nike

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

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

最佳答案

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

此外,当线程阻塞信号时到达的线程定向信号不会丢失 - 它们在线程解除阻塞信号时传递。因此,这里发生的情况是,您的线程向自己发送一个 SIGINT,该信号会排队直到信号处理程序返回。此时,信号被解除阻塞,从而允许信号被传递,并且处理程序被重新输入。

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

关于c - pthread_sigmask 在信号处理程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com