预备工作
- 进程必须要能识别信号
- 进程即使没收到信号,也要知道怎么处理这些信号,处理信号能力是内核系统内置功能
- 进程收到信号,可能不会立即处理信号,等到合适时机再处理
- 进程收到信号,到处理信号,必然有时间窗口,也就是进程有保存信号已经发生的能力
处理信号的三种模式:
- 默认
- 忽略
- 自定义
#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 能杀掉进程?因为发送了终止信号。
前台进程后台进程
杀掉的是前台进程。每次登录 Linux,会配一个 bash,只允许一个进程是前台进程,其他的都是后台进程,键盘输入的是前台进程。
如果改为后台进程?
./process &
可以看到,我们甚至可以输入 ls,即使乱码了,因为键盘输入发给前台进程,Ctrl+C 也杀不掉后台进程。
为什么乱码了也能执行 ls?我们键盘有自己的缓冲区,只是我们输入的时候给显示器发送一份而已,而显示器又在接收其他进程,互相干扰乱码了,但是我们键盘缓冲区存储了 ls。
并且后台进程可以启动多份的。我可以多运行几次该程序,打印速度就会变快。
ps aux | grep myprocess
kill -9 <pid>
查看信号列表:
kill -l
Ctrl+C 向前台发送 2 号信号了,而 2 号信号默认又代表终止,怎么验证?
自定义信号
signal 捕捉信号,再自己实现该信号功能,这就是自定义信号。
#include <iostream>
#include <unistd.h>
#include <signal.h>
std;
{
cout << << signo << endl;
}
{
(SIGINT, myhandler);
(){
cout << << endl;
();
}
;
}


