最近在查coredump的时候,一直发现堆栈不完整。于是很好奇abort的信号默认情况下会如何处理。
网上查了一下,发现信号分为进程间信号和多线程间信号。
进程间信号,即进程之间可以互发信号,也可以进程内部某个线程来产生信号。由系统库提供支持。
多线程间信号,即线程之间互发信号,且指定具体线程来接收并处理。由pthread库提供支持。
由于coredump的抓取过程,应该没有做过特殊处理,因此使用的就是进程间信号。那么进程内,当某个线程执行某个代码时,产生了abort信号,信号会由谁来负责处理?实际测试的结果是由具体产生abort信号的线程来处理执行。
查了一下网上的解释,信号的处理,是由内核态准备切换回用户态时来处理,由于在态切换时,主动地插入了一个函数跳转指令,进而转为执行信号处理函数。因此由产生abort信号的线程来处理实现即简单,也符合逻辑。
由于是中断处理,这一点上可以看做和windows类似。