1、信号概念:通知进程发生了某件事情,打断当前操作(属于软中断),去处理这个事件
信号种类很多,每一个信号代表一个事件
软中断:由软件产生的中断操作/模拟硬中断的一种方式/由操作系统中一些命令产生的中断信号
硬中断:由外部硬件产生的中断操作
软中断与硬中断的区别:
软中断是执行中断指令产生的,而硬中断是由外设引发的。
硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
硬中断是可屏蔽的,软中断不可屏蔽。
硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部
2、信号产生的方式:
<1>通过终端按键产生信号(例:Ctrl+c)
<2> 调用系统函数向进程发信号(例:kill命令)
<3>由软件条件产生
<4>由硬件异常产生
3、信号处理
默认处理: 操作系统中既定义好的信号处理方式
忽略处理: nothing to do
自定义处理:用户自己定义信号的处理方式
4、信号的分类
<1>可靠信号和不可靠信号
不可靠表现在:
1)当执行完信号处理函数后,恢复成缺省处理动作
2) 当多个信号同时抵达,可能出现信号丢失
1-31 :不可靠
34-64: 可靠
<2>实时信号和非实时信号
实时信号都是可靠信号
非实时信号都是不可靠信号
4、信号block,pending
信号的阻塞:阻止信号被处理
在pcb中有个信号阻塞集合,这个集合的作用就是用于标记哪些信号到来的时候暂时不去处理。
int sigprocmask(int how(对信号阻塞集合要进行的动作), const sigset_t *set, sigset_t *oldset);
SIG_BLOCK block = block | set 将set 中的信号添加到阻塞集合中
SIG_UNBLOCK block = block & (-set) 对set 中的信号解除阻塞
SIG_SETMASK block = set 将阻塞集合设置为set中的信号
int sigemptyset(sigset_t *set); 清空set信号集合
int sigfillset(sigset_t *set); 将所有信号添加到set集合中
int sigaddset(sigset_t *set, int signum); 将signum信号添加到set集合
int sigdelset(sigset_t *set, int signum); 将signum信号从set集合中溢出
在所有信号中 SIGKILL -9 SIGSTOP -19 无法被阻塞/自定义/被忽略
sigpending
读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。
5、可重入函数与不可重入函数: 一个函数如果同时被多条线程条用,且返回的结果严格一致就是可重入函数,否则就是不可重入函数。
如果函数内部:
- 操纵静态变量
- 调用了malloc/free,因为malloc使用全局链表来管理的
- 使用标准IO
就是不可重入函数
可重入函数:所有标准库函数都是可重入函数,可重入函数可以被任意打断