信号
信号是一种进程间通信(IPC)机制,主要用于处理异步事件。
不同的Unix衍生版所支持的信号类型并不完全相同。除了支持POSIX规定的信号外,还支持其他信号。
术语解释
术语 | 解释 |
---|---|
生成信号 | 发生了一个需要引起进程注意的事件而导致信号出现时。也叫发送信号 |
信号交付 | 被发送信号的那个进程识别到了信号并采取了适当动作。也叫接收信号 |
信号句柄 | 当信号出现时调用进行专门处理的函数。这个函数称为捕获函数或信号句柄 |
信号捕获 | 若信号交付时进程执行信号句柄,称进程捕获了信号 |
悬挂信号 | 当一个信号已经生成,但还未交付时,称该信号是悬挂的 |
信号类型
Linux支持62个信号。可以通过在终端输入kill -l
或man 7 signal
来查看。本页附录也有记录。
信号的宏定义和编号都定义在signal.h中。
信号产生
信号的产生方式多种多样,主要有3种:
- 程序错误
- 程序异常,如零做除数
- 进程超越CPU或文件大小的限制
- 外部事件
- 通过键盘终端
- 显示请求
- kill命令(或函数)
通过键盘终端
组合键 | 信号 |
---|---|
Ctrl+C | SIGINT |
Ctrl+\ | SIGQUIT |
Ctrl+Z | SIGSTOP |
通过kill命令
kill -信号编号 进程号 #比如 kill -15 4264
kill -信号的宏定义 进城号 #比如 kill -SIGTERM 4264
调用系统函数
- [[kill|kill]]
- [[raise|raise]]
- [[alarm|alarm]]
- [[abort|abort]]
信号处理
主要有3种:
- 忽略信号,对该信号不做处理,进程继续执行。但SIGKILL和SIGSTOP不能忽略
- 捕捉信号,使进程执行指定的程序代
- 默认处理方法,系统为每一个信号都设置了默认处理方法,通常为终止进程:
- 流产
- 终止
- 忽略
- 挂起
- 继续
还有其他的一些处理方法,比如将信号挂起,不影响当前程序的执行,待需要时再处理该信号。