系统编程之信号及信号处理
一、信号简介 (1)信号含义 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟;在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用 kill 发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。 (2)信号分类 可以使用kill -l命令查看当前系统支持的所有信号: 信号值小于 SIGRTMIN(<=34)的信号都是不可靠信号。它的主要问题是信号可能丢失。 信号值位于 SIGRTMIN 和 SIGRTMAX 之间的信号都是可靠信号,这些信号支持排队,不会丢失。 (3)信号的产生 信号可以由一下几种方式产生: 键盘事件:ctrl+c ctrl+\ ctrl+Z 等 非法内存:如果内存管理出错,系统就会发送一个信号进行处理 硬件检测到异常:如段错误,除 0,总线错误等 环境切换:比如说从用户态切换到其他态,状态的改变也会发送一个信号,这个信号会告知给系统 系统调用:如调用kill,raise,sigsend ,sigqueue函数等 (4)信号处理 进程可以通过三种方式响应信号: 接受默认处理 忽略信号(某些信号不能被忽略,如 SIGKILL 和 SIGSTOP) 捕捉信号并执行信号处理程序 二、信号操作 (1)信号发送 系统调用中用于发送信号的函数有 kill() raise() abort() 等。 kill() 函数 #include <signal.h> int kill(pid_t pid, int sig); //第一个参数pid代表接受信号的进程PID,第二个参数代表要发送的信号 参数 pid 会影响 kill()函数的作用,取值分为以下四种情况 若 pid>0,则发送信号 sig 给进程号为 pid 的进程。 若 pid=0,则发送信号 sig 给当前进程所属进程组的所有进程。 若 pid=-1,则发送信号 sig 给除 1 号进程和当前进程外的所有进程。 若 pid<-1,则发送信号 sig 给属于进程组 pid 的所有进程。 segqueue() 函数 sigqueue()函数支持发送信号的同时传递参数,需要配合 sigaction() 函数一起使用。...