UNIX环境高级编程之信号及其理解
2) 操作系统发现B进程正在运行,于是写入管理B进程的某个数据结构
3) 操作系统返回给A,A继续执行
4) B进程分配的处理器时间用完了,被时钟硬件中断
5) 操作系统的时钟硬件中断处理函数准备挂起B进程,也就是把寄存器和函数堆栈保存起来,发现B进程收到了singal
6) 操作系统在保存好B进程的stack和register后,新开stack(为了不干扰B进程真正的代码stack),激活B进程,B进程的信号处理函数。
参考:https://www.zhihu.com/question/24913599/answer/123534136
关于信号具体的一些基础知识实在没必要赘述,可以从随便一本讲述UNIX/Linux上的书里找到,下面写几点我认为比较重要的点:
1.首先signal是一种软中断,和时钟产生的硬中断相对应。其主要用来通知进程发生了异步事件。
2.发送signal是一个系统调用,只有内核才能向进程发送信号(其他都是间接),内核通过在进程PCB相应数据结构中设置合适的位做到信号传递。
3.signal的处理虽然是一个异步动作,但系统只有在进行状态(内核态和用户态转换、硬件中断)转换时才会对未处理信号进行处理。(信号处理底层机理)
4.信号在发送后存在一个未决状态(pending),在进程(内核)处理signal前或者进程将该信号屏蔽且该信号处理不是SIG_IGN的时候未决状态将保持。(可以理解为将PCB中信号相关位置位但尚未处理或者被屏蔽)
5.当信号屏蔽字改变(例如解除对某些信号的屏蔽时),若存在解除屏蔽信号的未决状态,这些信号的处理过程将会被调用(具体顺序未知。。。没找到相关资料==)。
6.当信号处于未决状态同时接收到新的信号时,信号将不会叠加(多个相同信号只会处理一个)。
7.信号屏蔽字相关设置以及信号处理函数设置需要仔细考虑,特别是在信号处理程序中再收到信号的处理、信号处理函数的可重入问题等。
8.当进程在阻塞期间收到信号时,如果该信号的处理不是SIG_IGN,其处理过程将会被调用,调用完成后返回阻塞前的代码继续执行。如果进程阻塞在系统调用中,则这是一个该进程从阻塞中恢复过来的时机,从信号处理函数返回之后进程将从该系统调用返回,默认不会重启该系统调用(不同unix可能不同,linux可以用sigaction的SA_RESTART标志调整),并将errno置位EINTR。
。。。更多待补充

浙公网安备 33010602011771号