信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法

目录

引入

共同特点

信号

介绍

特点

异步 

概念

同步

查看信号 

kill -l

实时操作系统和分时操作系统

分时

实时

man 7 signal

产生信号 

用户输入

介绍

原理

单个键

组合键

中断

系统事件

进程之间

kill()

pid

sig

raise()

命令行 -- kill指令

默认

指定信号

信号如何发送

引入 -- 信号怎样被管理

数据结构

发送信号的本质

信号的处理方式

默认操作

示例

自定义操作

忽略信号

不能被忽略的信号


引入

生活中有关信号的东西有很多

例如:红绿灯,闹钟,转向灯等等

共同特点

他们都有共同的特点

  • 我们是认识这些信号的,以及出现这些信号后我们需要干什么(我们都知道红灯停,绿灯行)
  • 认识信号+干什么,其实也就是可以识别信号
  • 即使没有出现这些信号,我们依然是知道这些信号相关内容的
  • 但是,我们接收到信号后,不一定就立即去处理它
  • (比如绿灯亮了,我们还可以等等再出发;或者外卖到了,你也不一定立刻就去拿)
  • 并且,因为我们不会立即处理,所以我们需要临时记住信号
  • (不然过了一会你就忘记了拿外卖,相当于忽略了这个信号的产生,这样是不符合我们的预期的)

信号

介绍

  • 在Linux操作系统中,信号是一种轻量级的进程间通信机制,用于在进程之间传递简单的通知
  • 当某个事件发生时,内核或其他进程可以向目标进程发送一个信号,目标进程在接收到信号后会执行相应的操作
  • 信号可用于通知进程发生的异常事件、请求进程终止或用户定义的事件等

特点

  • 和前面介绍的生活中的信号特点类似
  • 首先,进程需要有识别信号的能力(也就是认识这个信号是什么,以及收到信号后该如何处理)
  • 而这份能力,是由程序员交给它的(以代码的形式)

  • 信号产生的时间是随机的(无法确定收到的准确时间)
  • 所以,进程不会去阻塞等待信号出现,而是先干自己的事
  • 也就是 -- 接收到信号后,进程也不一定会立即处理
  • 为了方便后续的操作,进程需要记录收到的信号,等到合适的时候,再去处理

异步 

一般来说,信号的产生对于进程是异步的

概念

  • 在异步编程中,当一个任务被触发或启动后,程序不会立即阻塞等待该任务完成 , 而是会继续执行后续的代码,而异步任务会在后台进行
  • 一旦异步任务完成,它可以通知程序,并处理任务的结果

同步

  • 程序会在一个任务执行完成之前阻塞,并等待该任务返回结果后,再继续执行后续的任务
  • 对于一些耗时的任务和I/O操作来说,可能导致程序的执行效率较低

查看信号 

kill -l

这些是linux中可以支持的信号列表:

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第1张图片

  • 一共62个信号,编号从1开始,没有32,33
  • 1 ~ 31为普通信号(我们最常用的信号)
  • 34 ~ 64为实时信号

实时操作系统和分时操作系统

分时

为进程分配时间片,切换执行

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第2张图片

实时

立即响应

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第3张图片

man 7 signal

关于信号的详细解释

包括信号的含义、产生原因、默认行为、处理方式等信息:

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第4张图片

产生信号 

用户输入

介绍

有些信号可以由用户在终端上输入特定的键序列来产生

例如Ctrl+C(SIGINT)表示终止进程,Ctrl+Z(SIGTSTP)表示暂停进程

原理

单个键
  • 当我们在键盘上敲击一个键时,该键的电路将产生一个按键事件,通常为电气信号或电平变化
  • 键盘控制器会将按键事件转换为对应的扫描码
  • 每个按键都有一个唯一的扫描码
  • 该扫描码标识了按下的键是哪个键,并且还包括信息是否是按下或释放动作
  • 然后通过中断机制,将扫描码发送给cpu
  • 当cpu收到键盘中断后,它会执行预定义的中断处理程序,读取和解释键盘的扫描码,并将其转换为对应的字符或功能
组合键
  • 既然cpu可以处理一个键的输入,自然也就可以处理组合键
  • 当我们输入特定的组合键,由于其自身的设置,某个组合键 就代表 会触发操作系统产生预定义的信号
  • 所以,信号就可以通过键盘输入来产生
  • os再通过查找当前进程列表,找到前台正在运行的进程,向其写入刚刚产生的信号(在该进程pcb内部对应的位图结构中)
中断

是一种硬件机制,用于处理外部设备的事件或异常情况

它会打断cpu当前的执行,使其立即处理与中断相关的处理程序

系统事件

  • 操作系统在发生某些特定事件时,会向进程发送相应的信号
  • 例如,当进程试图除以零时,操作系统会发送SIGFPE信号

进程之间

kill()

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第5张图片

pid

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第6张图片

sig

要发送的信号编号,它可以是预定义的信号宏,也可以是用户自定义的信号编号

raise()

信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第7张图片

它允许进程在运行时发送信号给自己,触发自定义的信号处理操作

命令行 -- kill指令

(实际上底层还是调用了上面的系统接口)

它不仅可以终止(杀死)进程,还可以向进程发送其他信号,以便进行不同的处理

默认
  • 如果没有指定信号,默认情况下会向目标进程发送SIGTERM信号,这会请求目标进程正常退出
指定信号
  • 指定发送的信号 ( -s选项 )  (信号可以使用名称 / 编号):
  • 信号特点,异步/同步,查看信号,实时/分时os,产生信号(键盘输入(原理,单键/组合键,中断机制),系统事件,进程之间发送信号(kill,raise())),管理信号,发送信号的本质,处理信号的方法_第8张图片
  • 通常,只有root用户或进程的所有者(或者有特定权限的用户)可以向其他进程发送信号
  • 不是所有的信号都可以通过kill指令发送给进程,有些信号可能只能由内核或其他特定进程发送

信号如何发送

引入 -- 信号怎样被管理

我们先不去想是如何发送的,而是来思考一个问题

  • 我们可以通过多种方式来发送信号,但是进程不一定会立即处理他们
  • 所以为了不遗漏这些产生的信号,就需要对应的进程去保存他们收到的信号
  • 一旦这些需要被保存的信号数量增加,os势必要去管理他们
  • 那么就是 -- 先描述,再组织

数据结构

  • 再想想信号的特点,每个信号都有自己的编号,且常用的就31个
  • 而且信号对应的结果只有两种 -- 要么收到了该信号,要么没收到(可以对应1 / 0)
  • 是不是和位图的原理很像?
  • 所以我们可以使用位图来作为信号的结构
  • 又因为发送信号就是发送给某个特定的进程的
  • 所以,这个结构就在进程的pcb里

发送信号的本质

  • 从上面的分析我们已经知道,信号结构是存储在内核数据结构中的(pcb由os管理)
  • 也就代表 -- 只有os才能改变信号的状态 
  • 因此,我们无论通过什么手段来产生信号,实际上最终都是由os将信号的改变写入到信号位图结构中

信号的处理方式

默认操作

每个信号都有一个默认的处理方式,即系统默认定义的操作

  • 如果进程没有设置特定信号的处理方式,系统会执行该信号的默认操作

示例

  • 比如,收到外卖送达的消息后,你默认应该先去取外卖
  • SIGINT默认操作是终止进程
  • SIGTERM的默认操作是终止进程并清理资源

自定义操作

通过注册信号处理函数捕获特定信号,来完成对信号的特定响应

  • 当进程接收到捕获的信号时,会调用预先注册的信号处理函数来执行相应的操作
  • 比如,外卖送达后,你本应该吃掉,但你选择将它送给外卖员

忽略信号

进程可以选择忽略某个特定的信号

  • 如果设置了忽略信号的处理方式,当进程接收到该信号时,不会采取任何操作,信号被丢弃
  • 比如,设置的闹钟响了后,你选择继续睡觉,忽略这个闹钟

不能被忽略的信号

但是有一些信号是不能被忽略的

你可能感兴趣的:(linux,linux,运维,服务器)