https://www.jianshu.com/p/f445bfeea40a
信号的处理:
信号的处理有三种方法,分别是:忽略、捕捉和默认动作
信号处理函数的注册
信号处理函数的注册不只一种方法,分为入门版和高级版
- 入门版:函数
signal
- 高级版:函数
sigaction
信号处理发送函数
信号发送函数也不止一个,同样分为入门版和高级版
1.入门版:kill
2.高级版:sigqueue
可靠信号和不可靠信号
不可靠信号:信号可能会丢失,一旦信号丢失了,进程并不能知道信号丢失
可靠信号:也是阻塞信号,当发送了一个阻塞信号,并且该信号的动作时系统默认动作或捕捉该信号,如果信号从发出以后会一直保持未决的状态,直到该进程对此信号解除了阻塞,或将对此信号的动作更改为忽略。
对于信号来说,信号编号小于等于31的信号都是不可靠信号,之后的信号为可卡信号,系统会根据有信号队列,将信号在递达之前进行阻塞。
信号的阻塞和未决是通过信号的状态字来管理的,该状态字是按位来管理信号的状态。每个信号都有独立的阻塞字,规定了当前要阻塞地达到该进程的信号集。
信号阻塞状态字(block),1代表阻塞、0代表不阻塞;信号未决状态字(pending)的1代表未决,0代表信号可以抵达了;它们都是每一个bit代表一个信号
-
阻塞和未决是如何工作的?
比如向进程发送SIGINT信号,内核首先会判断该进程的信号阻塞状态字是否阻塞状态,如果该信号被设置为阻塞的状态,也就是阻塞状态字对应位为1,那么信号未决状态字(pending)相应位会被内核设置为1;如果该信号阻塞解除了,也就是阻塞状态字设置为了0,那么信号未决状态字(pending)相应位会被内核设置为0,表示信号此时可以抵达了,也就是可以接收该信号了。
阻塞状态字用户可以读写,未决状态字用户只能读,是由内核来设置表示信号递达状态的。
PS:这里额外说明以下,只有支持了 POSIX.1实时扩展的系统才支持排队的功能(也就阻塞状态下多次同一信号发送给某一进程可以得到多次,而不是一次)。 -
关于进程关于信号的阻塞状态字的设置
可以通过int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
函数来获取或者设置。
二、信号实现定时器
- alarm和pause实现定时:https://www.cnblogs.com/yxk529188712/p/4982401.html
- settimers实现定时:https://www.cnblogs.com/dandingyy/archive/2012/08/23/2653218.html
- 信号的讲解:https://blog.csdn.net/lemontree1945/article/details/82664802