信号基本概念
信号是什么
- 定义:信号是事件发生时,用来进程间通信的机制,也可以称为软中断。其实是在软件层次上对中断机制的一种模拟。大多数情况下,是无法预测信号的准确到达时间,所以,信号提供了一种处理异步事件的方法。
- 与硬中断的相同之处:都能打断当前执行的程序。
- 信号本质:信号的本质是int型数据,类似于硬中断中的中断号。内核针对每个信号 ,都给其定义了一个唯一的编号,从数字1开始,顺序展开。这些信号都有对应的名字(宏定义的形式)。这些宏在 <signum.h> 头文件中,不同系统信号的实际编号可能不同,所以在程序中一般使用信号的名字。
- 信号是异步的:只有信号产生时,才会告知程序、然后打断当前执行的正常流程、跳转去执行中断服务函数,这就是异步处理方式。
信号的发送者
- 硬件异常:检测到硬件异常 -> 内核 -> 相应的进程
- 终端输入产生信号的特殊字符:CTRL+C、CTRL+Z
- kill()系统调用:kill函数可以向进程发送任意信号,但是信号的发送者和接收者必须是同一个拥有者(即同一用户),或者信号是有root用户发送的。
- kill命令:kill命令是通过调用kill系统调用实现的。
- 软件事件:例如定时器的定时时间到、子进程退出、进程执行的CPU时间超时等。
信号接收者和处理方式
接收者
进程,信号通常是发送给对应的进程的,当信号到达后,该进程做出相应的处理。
处理方式
- 忽略信号:信号到达进程后,进程可以忽略对该信号的处理,就和没有接收到该信号一样。但是SIGKILL、SIGSTOP这两个信号不能忽略 ,因为这两个信号会向内核和超级用户提供终止或停止的可靠办法。
- 捕获信号:捕获信号就是指当进程接收到该信号时,执行用户定义的信号处理函数,该函数需要预先使用signal()函数绑定。
- 默认处理方式:进程不对该信号做出处理,交给系统进行处理,每个信号都有一个默认的处理方式。对于大多数信号来说,系统的默认处理方式就是终止该进程。
信号的分类
可靠信号与不可靠信号
不可靠信号:有可能会丢失的信号,信号值小于34的信号都是不可靠信号,
可靠信号:支持排队的信号,
新的信号发送函数:sigqueue()、sigaction()
实时信号与非实时信号
非实时信号都不支持排队,都是不可靠信号,一般称为标准信号,
实时信号都支持排队,都是可靠信号,保证了发送多个信号都能被接收,可用于进程