在 http://blog.youkuaiyun.com/r21nn/article/details/64128764 中记录了对signal()函数和sigaction()函数的分析,这里分析用户程序进行系统调用(int 0x80)时中断处理程序对信号的处理。在进程每次调用系统调用时,若该进程已收到信号,则该函数就会把信号的处理句柄(即对应的信号处理函数)插入到用户程序堆栈中。这样,在当前系统调用结束返回后就会立刻执行信号句柄程序,然后再继续执行用户的程序,如下图所示
在用户程序调用系统调用刚进入内核时,该进程的内核态堆栈上会由CPU 自动压入如图5-8 中所示的内容,也即:用户程序的SS 和ESP 以及用户程序中下一条指令的执行点位置CS 和EIP。
在处理完此次指定的系统调用功能并准备调用do_signal()时,内核态堆栈中的内容见图5-9 中左边所示。因此do_signal()的参数即是这些在内核态堆栈上的内容。