在多线程程序中捕获SIGINT信号

8

我正在编写一个多线程程序,希望能够处理用户可能发出的Ctrl-C命令以终止执行。据我所知,并没有保证主线程能够捕获到该信号,尽管主线程可以取消每个工作线程。因此,是否需要在工作线程的代码中设置不同的信号处理程序,以便任何人都能在信号到达时捕获它,或者是否有其他方法只在主线程的代码中设置信号处理程序就能实现这一点?

1个回答

9

您可以使用pthread_sigmask()来阻止来自调用线程的信号。

而且,由于被阻止的信号会被新创建的线程继承,因此您可以在主线程中阻止SIGINT信号,然后启动其他线程,如果需要的话,可以在主线程中取消阻止。


但是如果子线程恰好捕获并忽略了它,这种方式不会丢失sigint信号吗? - nikos
1
@nikos:是的,但我没有看到与我所写的内容有关系;如果一个线程阻塞了一个信号,它就不能捕获它,这是定义上的。 - janneb
1
@nikos:一个被阻塞的线程(例如使用pthread_sigmask())永远不会接收到信号——这与线程捕获并忽略信号是不同的。如果除了主线程以外的所有线程都已经阻塞了SIGINT,那么它将始终被传递到主线程。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接