【发布时间】:2013-12-02 10:06:53
【问题描述】:
我想知道sigaction 是否会为调用线程或整个进程创建信号处理程序。如果它解除了对信号的阻塞并为整个进程创建了一个信号处理程序,那么我怎样才能确保只有一个线程会使用该信号处理程序并让其他线程阻塞该信号。
在我的例子中,我希望一个线程在警报信号发出时调用信号处理程序,而其他线程则简单地阻止它。
void alarmSigHandler(int signo){
}
void* alarm_thread_start_routine(void *arg){
// Perform some tasks
}
int main(){
// Main thread start
/* Unblock alarm signal */
/* Assign signal handler for alarm signal */
/* Launch alarm signal handler thread */
/* Block alarm signal with pthread_sigmask */
/* Do something */
return 0;
}
http://vip.cs.utsa.edu/classes/cs3733f2013/notes/SignalsAndThreads.html
如果将信号发送到线程程序,则任何线程都可以处理该信号。
每个线程都继承进程信号掩码,但每个线程都有自己的信号掩码,可以用 pthread_sigmask 修改。
sigprocmask 不应在线程环境中使用,但可以在创建线程之前使用。
在多线程环境中处理信号的最简单方法是拥有一个专用于信号处理的线程。
涉及信号安全的问题可以使用 sigwait 来处理:
The main process blocks all signals before creating any threads.
No signal handlers are set up.
A thread is created to handle the signals.
That thread sets up a sigset_t containing the signals of interest.
It loops, calling sigwait and handles the pending signals.
【问题讨论】:
-
为避免在处理程序设置期间出现竞争的可能性,主线程应首先忽略/阻止所有信号,然后生成线程以接收任何信号,然后是线程接收 (a) 特定信号的应设置其/他们自己需要的处理程序。
标签: c unix signals posix signal-handling