pthread_sigmask 在信号处理程序中不起作用
Posted
技术标签:
【中文标题】pthread_sigmask 在信号处理程序中不起作用【英文标题】:pthread_sigmask won't work in signal handler 【发布时间】:2013-11-05 18:12:52 【问题描述】:我有这样一个信号处理程序:
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 不引起信号风暴。不幸的是,信号不会停止发送。我做错了什么?
【问题讨论】:
你想做什么?您希望程序将 SIGINT 定向到一个线程(大概),然后让该线程向所有其他线程发出信号,以便它们被中断并关闭? 【参考方案1】:信号掩码是每个线程的 - 如果您的其他线程尚未阻塞 SIGINT
,当您在循环中向它们发出信号时,它们也会进入此处理程序,并开始发送信号。
此外,在线程阻塞信号时到达的线程导向信号不会丢失 - 它们在线程解除阻塞信号时传递。所以这里发生的是你的线程向自己发送了一个SIGINT
,它会排队等待信号处理程序返回。此时,信号被解除阻塞,从而允许传递信号,并重新进入处理程序。
您可以调用sigaction()
作为信号处理程序中的第一个操作来更改SIGINT
的信号处理程序,这将影响所有线程。
【讨论】:
以上是关于pthread_sigmask 在信号处理程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
未定义对安装diesel_cli 的“pthread_sigmask@GLIBC_2.32”的引用