将信号分为以上四个阶段
1.信号注册:是针对信号处理方式的规定,进程收到信号时有三种处理方式:默认动作,忽略,自定义动作。如果不是自定义动作,这一步可以忽略。这个步骤要使用到signal/sigaction接口
2.信号产生:就是操作系统向进程发出信号
3.信号保存
4.信号捕捉处理
信号有哪些
1-31是普通信号 34-62是实时信号
Action列指的是当信号被发送到一个进程时,默认操作系统采取的动作。具体的动作类型和含义如下:
-
Term (Terminate):
- 终止进程。此操作表示操作系统将结束进程的执行。这是大多数信号的默认动作。
-
Core (Terminate and Dump Core):
- 终止进程并生成核心转储文件。核心转储文件包含了进程在被终止时的内存状态,可以用于调试目的。想了解core的调试看这篇文章
-
Ign (Ignore):
- 忽略信号。进程接收到信号时,操作系统不会采取任何动作,也不会通知进程。
-
Stop:
- 停止进程的执行。进程被暂停,直到接收到继续信号(如SIGCONT)。
-
Cont (Continue):
- 继续执行被停止的进程。此操作恢复一个之前被暂停的进程的执行。
理解信号
信号和生活中的信号是一样的。例如下课铃声就是一个信号,上学的第一天,老师会告诉我们下课铃声响起的时候就可以下课休息——信号规定。当一节课的下课铃声响起,我们收到这个信号,但是老师想拖堂,我们先将这个信号保存到大脑,等老师讲完才会对下课信号处理。从下课铃声响起到真正下课这段时间就是时间窗口。信号产生了并不代表现在就要处理,进程会选择在合适的时间进行处理。
信号注册
signal
signal是将signum这个信号的处理方式进行自定义
注意:信号9和信号19不可以修改,因为进程终止和停止的权利必须由操作系统掌握
例子:
将信号1自定义捕捉
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
void fun(int signum)
{
cout << "get signum" << signum << endl;
}
int main()
{
signal(1,fun);
while(1)
{
cout << "process running pid:" << getpid() << endl;
sleep(1);
}
return 0;
}
运行程序发送信号1
sigaction
了解信号保存信号处理后再了解这个接口!!!!