信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源

在多线程程序中,处理信号问题应该最让人头疼的了。信号是一种底层的BSD机制,将信息提供给进程或者用一些其他方法来操作它。一些程序使用信号来检测诸如子进程销毁的事件。系统通过使用信号来终止失控进程。

多线程程序会有信号的问题,在单线程程序中,所有的信号处理都是在主线程上执行。在多线程程序中,如果多个线程同时运行,则信号可以传送到任何一个线程上。也就是说信号可以传送到进程中任何线程上

对于一些异常,内核不能处理而只能通过发送信号把异常交给进程自己处理。例如在x86架构的CPU上,如果一个进程尝试将一个数除以零,将会产生divide error异常,并使内核向出错的进程发送SIGFPE信号。相似地,如果一个进程尝试访问虚拟地址空间以外的内存,内核将向进程发送SIGSEGV信号。异常与信号的具体对应关系在不同的CPU架构上是不同的。

在实现信号处理程序时,第一件事就是不要通过大脑随便乱想觉得是哪个线程正在处理信号。如果想要特定的线程处理某一个信号时,那么当信号到达是我们需要通知该线程。不能因为该线程添加了信号处理程序就说该信号就会传到该线程。

对于信号相关这里不做过多的说明。

本人总结TIPS

  • 信号可以传送到进程中任何线程上;

相关链接

Unix信号

Linux环境进程间通信(二): 信号(上)

results matching ""

    No results matching ""