【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. 总结

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

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

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

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

在后面的文章中一一讲解


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


相关文章
|
2月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
145 2
|
2月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
47 2
|
8天前
|
Linux Shell
6-9|linux查询现在运行的进程
6-9|linux查询现在运行的进程
|
5天前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
16 0
|
1月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
1月前
|
NoSQL
gdb中获取进程收到的最近一个信号的信息
gdb中获取进程收到的最近一个信号的信息
|
21天前
|
存储 监控 安全
探究Linux操作系统的进程管理机制及其优化策略
本文旨在深入探讨Linux操作系统中的进程管理机制,包括进程调度、内存管理以及I/O管理等核心内容。通过对这些关键组件的分析,我们将揭示它们如何共同工作以提供稳定、高效的计算环境,并讨论可能的优化策略。
22 0
|
1月前
|
Unix Linux
linux中在进程之间传递文件描述符的实现方式
linux中在进程之间传递文件描述符的实现方式
|
2月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
53 0
|
3月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
下一篇
无影云桌面