我一直在试图了解如何POSIX线程和POSIX信号相互作用的复杂性。我特别感兴趣:控制信号传递到哪个线程的最佳方法是什么(假设它首先不会致命)?告诉另一个线程(实际上可能很忙)信号到达的最佳方法是什么?(我已经知道,使用信号处理程序中的pthread条件变量是一个坏主意。)如何安全处理将发生信号的信息传递给其他线程?这是否需要在信号处理程序中发生?(我通常不希望杀死其他线程;我需要一种更巧妙的方法。)作为我为什么要这样做的参考,我正在研究如何将TclX包转换为支持线程,或者将其拆分并至少使一些有用的部件支持线程。信号是那些特别令人感兴趣的部分之一。
3 回答

呼如林
TA贡献1798条经验 获得超3个赞
根据POSIX标准,所有线程在系统上应以相同的PID出现,并且使用pthread_sigmask()可以为每个线程定义信号阻止掩码。
由于只允许为每个PID定义一个信号处理程序,因此我更喜欢在一个线程中处理所有信号,并pthread_cancel()在需要取消正在运行的线程时发送。这是首选方法,pthread_kill()因为它允许为线程定义清理功能。
在某些较旧的系统上,由于缺少适当的内核支持,正在运行的线程可能具有与父线程的PID不同的PID。有关在Linux 2.4上使用linuxThreads处理信号的信息,请参见常见问题解答。

侃侃尔雅
TA贡献1801条经验 获得超16个赞
到目前为止,我在哪里:
信号来自不同的主要类别,其中一些通常通常应该终止进程(SIGILL),而某些则永远不需要做任何事情(SIGIO;更容易直接进行异步IO)。这两个类无需采取任何措施。
有些信号不需要立即处理。像SIGWINCH这样的东西可以排队直到方便为止(就像X11中的事件一样)。
棘手的是那些您想通过中断正在执行的操作来对它们做出响应,而又不会消灭线程的程度。特别是,在交互模式下的SIGINT应该使事物响应。
我还有需要整理signal
VS sigaction
,pselect
,sigwait
,sigaltstack
,和一大堆其他位和POSIX(和非POSIX)API的作品。
- 3 回答
- 0 关注
- 453 浏览
添加回答
举报
0/150
提交
取消