linux signal 处理

转至:http://blog.csdn.net/zhuixundelang/article/details/5979465
linux signal 
处理

 

说明:

本文主要翻译自ULK 3rd chapter 11.

主要受 http://blog.csdn.net/yunsongice影响,故发表在csdn.

另外,本文是最初版本,估计以后会有一个改进版本文中还有很多todo的地方.

另外,如果有版权问题,通知我,我马上删掉.

 

总结

信号分成两种:
regular signal( 
非实时信号), 对应的编码值为[1,31]
real time signal 
对应的编码值为[32,64]

 

编码为的信号不是有效信号,只用于检查是当前进程否有发送信号的 权限 ,并不真正发送。

 

线程会有自己的悬挂信号队列并且线程组也有一个信号悬挂队列.

信号悬挂队列保存task 实例接收到的信号只有当该信号被处理后它才会从悬挂队列中卸下.

 

信号悬挂队列还有一个对应的阻塞信号集合当一个信号在阻塞信号集合中时,task 不会处理该被阻塞的信号但是该信号依旧在悬挂队列中). 当阻塞取消时它会被处理.

 

对一个信号要三种处理方式:

忽略该信号;

采用默认方式处理调用系统指定的信号处理函数);

使用用户指定的方式处理调用用户指定的信号处理函数).

对于某些信号只能采用默认的方式处理(eg:SIGKILL,SIGSTOP).

 

信号处理可以分成两个阶段信号产生并通知到接收方(generation), 接收方进行处理(deliver)

………

 

 

简介

Unix 为了允许用户态进程之间的通信而引入signal. 此外内核使用signal 给进程通知系统事件30 年来, signal 只有很小的变化.

以下我们先介绍linux kernel 如何处理signal, 然后讨论允许进程间  exchange 信号的系统调用.

 

The Role of Signals

signal 是一种可以发送给一个进程或一组进程的短消息或者说是信号但是这么容易和信号量混淆). 这种消息通常只是一个整数而不包含额外的参数.

linux 提供了很多种signal, 这些signal 通过宏来标识这个宏作为这个信号的名字). 并且这些宏的名字的开头是SIG.eg: SIGCHLD , 它对应的整数值为17, 用来表示子进程结束时给父进程发送的消息即当子进程结束时应该向父进程发送标识符为17 signal/ 消息信号) . SIGSEGV, 它对应的整数值为11, 当进程引用一个无效的物理地址时内核会向进程发送标识符为11 signal/ 消息信号参考linux 内存管理的页错误异常处理程序以及linux 中断处理).

信号有两个目的:
1. 
使一个进程意识到一个特殊事件发生了不同的事件用不同的signal 标识)
2. 
并使目标进程进行相应处理(eg: 执行的信号处理函数, signal handler). 相应的处理也可以是忽略它.

当然这两个目的不是互斥的因为通常一个进程意识到一个事件发生后就会执行该事件相应的处理函数.

下表是linux2.6 80×86 上的前31 signals 及其相关说明这些信号中有些是体系结构相关的(eg:SIGCHLD,SIGSTOP), 有些则专门了某些体系结构才存在的(eg:SIGSTKFLT) ( 可以参考中断处理里面也列出了一些异常对应的signal).

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>