上篇文章:Linux操作系统4-进程间通信5(共享内存实现两个进程通信)-CSDN博客
本篇Gitee仓库:myLerningCode/l25 · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)
本篇重点:信号的概念
一. 信号基础
1.1 生活中的信号
我们日常生活中的闹钟,红绿灯,车喇叭,通知等都是信号。信号的目的就是通知某一个物体去做某一件事情。
我们再日常生活中收到信号之后可能的反映:
1 根据收到的信号去做某一件事(比如红灯停)
2 收到某信号后啥也不做(闹钟响了继续睡)
3 忽略某一个信号(将手机关机)
1.2 进程信号
进程信号最简单的例子就是:我们的一个程序在前台运行,我们输入 ctrl c 去终止这个进程。我们输入 ctrl c 之后正在运行的进程就会收到一个信号然后终止。
我们可以输入 kill -l 查看所有的信号
可以看到一共有64个信号,其中34编号以上的信号是实时信号,这里不过多介绍 。只讨论34号以下的普通信号。
1.3 信号原理简介⭐
首先我们要知道:信号是给进程发送的,比如 kill -9 进程pid。就是给某一个进程发送9号信号让其强制终止。
那么问题来了:进程是如何保存信号的呢?信号是如何发送的呢?
信号保存在进程的进程控制块PCB中,在task_struct中有一个位图signal,当进程收到x编号的信号之后,就将位图的x位写为1,表示收到这个信号了。但是进程收到信号之后不一定会立马处理这一个信号,可能要过一再在处理。
进程的发送是由OS操作的,因为OS是进程的管理者,OS可以直接向某一个进程的PCB中写入数据。
我们无论以何种方式向进程发送信号,本质都是通过OS去修改PCB中的数据。
1.4 进程处理信号的3种方式
1 忽略收到的信号
2 执行该信号的默认操作,或者程序员自定义的操作
3 收到信号后啥也不做
1.5 信号的生命周期⭐
信号的生命周期为:信号的产生 -> 信号的保存 -> 信号的处理。具体过程如下图: