背景知识铺垫
1.1 信号的基本概念
Linux 信号是一种异步通信机制,用于在进程之间传递事件或在系统与进程之间进行交互。当发生某个特定事件时,如用户输入特定组合键(Ctrl+C 等)、进程异常终止,系统就会向相关进程发送信号。
1.2 进程对信号的处理
进程在被设计时,就内置了识别信号的方法以及默认处理不同信号的方式。当进程接收到信号时,并不一定会立即处理,这要求进程需要具有保存信号的能力。当等到合适的时候,进程会根据信号的类型结合自己的处理方式做出处理。
进程在处理信号的方式:
- 默认处理方式(进程内置的)
- 忽略信号
- 自定义处理方式(捕捉信号后,使用用户设定的方法)
信号的产生
2.1 前台进程和后台进程
首先看下面的程序:
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
while (true) {
cout << "I'm a crazy process, PID:" << getpid() << endl;
sleep(1);
}
return 0;
}
当我们执行该程序后,再输入 ls、pwd,可以看到指令并不会执行,进程则一直运行。当我们使用 Ctrl+C 就可以将进程终止,这样的进程就是前台进程。
再次执行该程序,以后台进程的形式执行该进程 ./可执行程序 &,可以发现,当进程执行后,我们再输入指令,此时指令是可以成功执行的。当我们使用 Ctrl+C 时无法终止进程。这种进程为后台进程。
Linux 中,一次登录,一个终端,一般配有一个 bash,而每个终端只允许有一个前台进程,可有多个后台进程。当我们执行 ./process 时,前台进程就由 bash 变为了 ./process,而键盘输入是优先被前台进程获取的,所以指令无法被执行。但前台进程 ./process 接收到 Ctrl+C 信号时就会终止。
再来理解第二个现象,当我们以后台进程运行 ./process 时,此时 bash 仍被视为前台进程,当用户输入指令时仍可被接收并执行。此时再输入 Ctrl+C 信号,./process 进程并没有接收,所以没有终止。
前台进程:会独占终端,直到进程执行完成或者被挂起,在这期间终端无法接受其他命令输入,用户只能与该进程进行交互。 :不会占用终端,终端可以继续接受用户输入的其他命令,用户可以在同一个终端中同时启动多个后台进程。


