1. 信号是什么
在 Linux 中,信号(Signal)是一个非常重要的知识点。简单来说,信号是一种给进程发送的、用来进行事件异步通知的机制。
什么是异步通知? 举个例子,上课的时候老师发现张三还不在教室,如果此时继续上课而不等待张三,就是异步;如果老师等张三回来再上课,则是同步。
根据上述描述,可以得到关于信号的几个基本结论:
- 预先定义:进程在信号没有产生的时候,就知道信号该如何处理了。
- 非立即处理:信号的处理不是立即执行,而是可以等到合适的时候再进行。
- 内置识别:进程早已内置了对信号的识别与处理方式。
- 来源多样:信号源非常多,给进程产生信号的途径也非常多。
2. 信号的产生
信号需要先产生,然后保存,最后处理。下面探讨信号的产生方式。
1. 键盘产生信号
通过键盘输入特定组合键可以产生信号。例如 Ctrl + C 是终止当前前台进程的信号。
代码示例:
#include <iostream>
#include <unistd.h>
int main() {
int cnt = 0;
while (true) {
std::cout << "hello world : " << cnt++ << std::endl;
sleep(1);
}
return 0;
}
在 Linux 系统中,信号本质上是数字。为了便于表示,使用了宏替代数字。1~31 是普通信号,后面的是实时信号。Ctrl + C 触发的是 2 号信号(SIGINT)。
信号处理动作: 进程收到信号后,有三种处理方式:
- 默认处理:系统预设的动作(如 SIGINT 默认终止进程)。
- 自定义处理:用户定义特定的处理函数。
- 忽略处理:不理会该信号。
signal 替换信号处理
可以使用 signal 函数修改信号的默认行为。
代码示例:
#include <iostream>
#include <unistd.h>
{
std::cout << << sign << std::endl;
}
{
(, handlerSign);
cnt = ;
() {
std::cout << << cnt++ << std::endl;
();
}
;
}

