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

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

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

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

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

在后面的文章中一一讲解


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


相关文章
|
1天前
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
9 3
|
1天前
|
调度 索引
【操作系统】进程的基本概念&进程的状态与转换&进程的组织方式
【操作系统】进程的基本概念&进程的状态与转换&进程的组织方式
8 2
|
3天前
|
存储 Linux 数据安全/隐私保护
Linux进程间通信
Linux进程间通信
17 6
|
3天前
|
存储 Unix Linux
【Linux 系统】进程信号 -- 详解(下)
【Linux 系统】进程信号 -- 详解(下)
|
3天前
|
NoSQL Linux Shell
【Linux 系统】进程信号 -- 详解(上)
【Linux 系统】进程信号 -- 详解(上)
|
3天前
|
消息中间件 存储 安全
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)
|
存储 IDE Unix
用了这么久 Linux ,才知道这些概念。。。
我们大家应该知道,Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构,/ 是 Linux 和 UNIX 中的根目录,同样它也是文件系统的起点。所有的文件和目录都位于 / 路径下,包括我们经常听到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系统中,各个厂家都定义了自己文件系统的命名构成,比较混乱,而且难以区分。
用了这么久 Linux ,才知道这些概念。。。
|
3天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
1天前
|
关系型数据库 MySQL Java
1.Linux常用命令
1.Linux常用命令
8 1
|
4天前
|
Linux
【超全】Linux命令思维导图总结 值得收藏
【超全】Linux命令思维导图总结 值得收藏
10 0