【linux进程信号(一)】信号的概念以及产生信号的方式

简介: 【linux进程信号(一)】信号的概念以及产生信号的方式

1. 前言

在实际生活中有很多信号的例子,比如红灯停,绿灯行.我们是怎样知道这些信号的呢?首先要识别这个信号,并且要知道如何处理这个信号,在Linux系统中的信号也是如此,至少要做到两点: 识别信号,处理信号

本章重点:

本篇文章着重讲解Linux下信号的基本
概念以及产生信号的四种方式,本篇文章
会带领大家入门信号这一篇章


2. 信号的基本概念

先给结论,什么是Linux信号?

本质是一种通知机制,用户或操作系统通过发送一定的信号,通知进程,某些事件已经发生,你可以在后续对它进行处理

使用kill -l命令查看信号列表

CTRL+c就是向进程发送2号信号

结合进程和信号,我们得出下面的结论:

  1. 进程要处理信号,必须具备识别信号的能力(看见信号+处理信号)
  2. 凭什么进程能够识别信号?是事先程序员就内置了一套代码用于识别+处理信号
  3. 信号的产生是随机的,收到信号时,此进程可能正在忙于其他事情,所以收到信号可能并不是立刻就处理,可能是后续处理
  4. 既然信号不是立刻就处理的,那么一定存在某种结构来短暂保持收到的信号

对于信号的理解可以分为: 信号的产生,保存以及处理

而本篇文章讲解的则是信号的产生,

信号的产生一共有四种方式:

  1. 终端按键产生信号
  2. 使用系统调用产生信号
  3. 由软件条件产生信号
  4. 由硬件条件产生信号

3. 信号产生的方式概述

  1. 方式一: 终端按键

我们可以使用CTRL+c或CTRL_/的
方式产生信号,并且CTRL+c产生的是
2号信号,也就是SIGINT信号,然而
CTRL+/产生3号信号,也就是SIGQUIT

1~31号信号是普通信号,也是要重点学习的,

34~64号信号是实时信号,不多谈

使用man 7 singal查看信号描述

Term代表终止这个进程,这也就是为什么

CTRL+c可以终止进程的原理,core会在

后面进行讲解

  1. 方式二: 系统调用

在函数中调用kill,raise,abort等函数也能产生信

kill是向指定进程发送指定的信号

raise是向自己发送指定的信号

abort是终止当前进程(发送6号信号)

  1. 方式三: 软件条件

请大家注意第13号信号,SIGPIPE,当我们在学习管道时会遇见这种情况,管道读端不光不读了,并且还把读端关闭了,而写端还在写,此时操作系统会自动终止写进程.怎样终止的呢?是OS向写端发送了SIGPIPE信号而终止了进程

  1. 方式四: 硬件异常

最典型的除0错误,指针系列错误以及段错误都是由于硬件异常而产生的信号,从而导致进程被终止

所有的信号都有它的来源,但最终全部都被操作系统识别,解释,并且发送给进程


4. 核心转储讲解

在查看信号的描述时,我们会注意到

某些信号的默认行为是core,也就是

核心转储

核心转储指的是,当进程出现某种异常时,是否由操作系统将当前进程在内存中的相关核心数据,转移到磁盘中,如果核心转储被设置,则会转移到磁盘,反之则不会,若信号的默认做法是core,则在终止进程的同时会发生核心转储,目录中会多出一共文件

当代码异常终止,并且发生核心转储后,使用gdb调试时只需输入: core file即可定位到出错的行


5. 如何理解信号发送的本质?

上面说到,信号被进程接收到后不会立马处理,

那么就要存在一个结构来保存信号,什么结构

最合适?我给出的答案是位图!

信号有1~31号信号,那么只需要31个
bit位即可保存完所有的信号,x号bit
位中的0/1代表是否收到第x号信号,
而这个位图结构是每个进程独有的,
所以它很明显在进程的PCB中保存

`信号发送的本质: 操作系统向目标进程发送信号,也就是操作系统直接修改PCB中指定的位图结构,修改完成后即为成功发送信号


6. 总结

本篇文章只是打响了认识信号的

第一枪,关于信号的细节还有很多,

包括进程是如何保存信号的细节,以及

进程是如何捕捉到信号的,这些都会

在后面的文章中一一讲解


🔎 下期预告:信号的保存以及处理 🔍


目录
打赏
0
5
4
0
18
分享
相关文章
|
1月前
|
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
45 0
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
40 0
|
1月前
|
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
35 0
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
43 0
用了这么久 Linux ,才知道这些概念。。。
我们大家应该知道,Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于 / 路径下,包括我们经常听到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。
用了这么久 Linux ,才知道这些概念。。。
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree
linux命令—cd
`cd` 命令是 Linux/Unix 系统中用于切换工作目录的基础命令。支持相对路径与绝对路径,常用选项如 `-L` 和 `-P` 分别处理符号链接的逻辑与物理路径。实际操作中,可通过 `cd ..` 返回上级目录、`cd ~` 回到家目录,或利用 `cd -` 在最近两个目录间快速切换。结合 Tab 补全和 `pwd` 查看当前路径,能显著提升效率。此外,需注意特殊字符路径的正确引用及脚本中绝对路径的优先使用。
|
21天前
|
Linux命令拓展:为cp和mv添加进度显示
好了,就这样,让你的Linux复制体验充满乐趣吧!记住,每一个冷冰冰的命令背后,都有方法让它变得热情起来。
62 8
Linux环境下必备的基础命令概览
以上就是Linux系统中的基本命令和工具,掌握它们就能帮你在Linux世界里游刃有余。这其实就像是学习驾驭一辆新车,熟悉了仪表盘,调整好了座椅,之后的旅程就只需要享受风驰电掣的乐趣了。
44 4
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
144 32
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问