预备工作
- 进程必须能识别信号。
- 即使未收到信号,进程也需具备处理信号的能力,这是内核系统内置功能。
- 进程收到信号后可能不会立即处理,而是等到合适时机。
- 从收到信号到处理信号存在时间窗口,进程需具备保存信号已发生状态的能力。
处理信号的三种模式
- 默认
- 忽略
- 自定义
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
while(1) {
cout << "i am a process" << endl;
sleep(1);
}
return 0;
}
执行 ./process。为什么 Ctrl+C 能杀掉进程?因为发送了终止信号(SIGINT)。
前台进程与后台进程
杀掉的是前台进程。每次登录 Linux,会分配一个 Bash,只允许一个进程是前台进程,其他都是后台进程。键盘输入发送给前台进程。
如果改为后台进程:
./process &
可以看到,即使输入 ls 导致显示器乱码,程序仍在运行。因为键盘输入发给前台进程,Ctrl+C 也杀不掉后台进程。乱码是因为键盘缓冲区存储了输入,而显示器缓冲区接收其他进程干扰,但键盘缓冲区数据正常。
后台进程可以启动多份。运行多次该程序,打印速度会变快。
查看进程 PID 并杀掉:
ps ajx | grep myprocess
kill -9 <pid>
查看所有信号列表:
kill -l
Ctrl+C 向前台发送 2 号信号(SIGINT),默认代表终止。如何验证?
自定义信号
使用 signal 捕捉信号,再自己实现该信号功能,即为自定义信号。
#include <iostream>
#include <unistd.h>
#include
std;
{
cout << << signo << endl;
}
{
(SIGINT, myhandler);
() {
cout << << endl;
();
}
;
}


