【Linux】:信号(一)产生

信号

  • 一.前台进程和后台进程
    • 1.前台进程
    • 2。后台进程
    • 3.总结
  • 二.自定义信号动作接口
  • 三.信号的产生
    • 1.键盘组合键
    • 2.kill+信号+进程pid
    • 3.系统调用
      • 1.kill函数
      • 2.raise函数
      • 3.abort函数
  • 四.异常
  • 五.软件条件
  • 六.core文件

在这里插入图片描述

一.前台进程和后台进程

1.前台进程

一个简单的代码演示

在这里插入图片描述

在这里插入图片描述

像这种程序在运行时,不能执行其他命令并且可以被ctrl+c终止的进程被称为前台进程。

2。后台进程

我们另外打开一个窗口,在另一个窗口运行程序。

在这里插入图片描述

这样在当前进程我们依然可以使用各种命令,但是该进程不能被ctrl+c终止,这样的进程被称为后台进程。

前台进程加个&也能变成后台进程。
在这里插入图片描述

在这里插入图片描述

可以通过进程的pid使用kill直接终止。

在这里插入图片描述

3.总结

Linux中,一次登陆中,一个终端,一般会配上一个bash,每一个登陆,只允许一个进程是前台进程,可以允许多个进程是后台进程。两者的本质区别就是谁来获取键盘输入。

为什么使用Ctrl c能将前台进程终止呢?就是因为前台进程能够读取到键盘输入,而ctrl c的本质就是发送一个2号信号。

在这里插入图片描述

我们把1到31号信号称为普通信号(产生后不必立即处理),后面的称为实时信号(一旦产生必须处理)。下面我们只对普通信号进行讨论。

信号的处理方式一般有三种:
1.默认处理 (例如2号信号的默认动作就是终止自己)
2.忽略信号
3.自定义方式(信号捕捉)。

二.自定义信号动作接口

在这里插入图片描述

第一个参数:指定要进行自定义的信号。

第二个参数:一个函数,要自定义的动作,该函数的返回值是void,参数表示该信号。

例如:2号信号默认是终止,接下来把它更改一下

在这里插入图片描述

在这里插入图片描述

注意:

  1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。

  2. Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。

  3. 前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。

  4. 为什么操作系统能够读到ctrl+c呢?因为cpu实际上与键盘的一部分是直接相连的,当键盘开始输入时就会直接向CPU发送一个硬件中断,然后CPU就会让操作系统来读取键盘的输入,最后将输入内容进行相应的解读。

三.信号的产生

1.键盘组合键

上面已经介绍了ctrl+c—>信号2。这就是一种键盘组合键

ctrl+\ ->信号3

在这里插入图片描述

在这里插入图片描述

ctrl+z->19号

在这里插入图片描述

在这里插入图片描述

可以看到它并没有如我们预期那样打印,说明它是不能被捕捉的。

所以不是所有信号都能被捕捉。

2.kill+信号+进程pid

我们经常使用kill+进程pid终止程序,kill也常用来给进程发送信号,例如接下来给进程分别发送1,2,3信号。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.系统调用

1.kill函数

系统调用函数也可以直接发送命令。

在这里插入图片描述

示例

在这里插入图片描述

另外创建一个死循环程序,用该程序终止。

在这里插入图片描述

在这里插入图片描述

2.raise函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.abort函数

在这里插入图片描述

它是引起一个正常的进程直接终止。给自己发一个6号信号。

在这里插入图片描述

四.异常

一个程序发生异常本质上是收到了信号。

各种异常

在这里插入图片描述

在这里插入图片描述

很明显出现了异常并且只打印出了上面一句话,后面并没有进行打印。实际上这是接收了8号信号。

在这里插入图片描述

在这里插入图片描述

这是一个最常见的段错误。它收到了11号信号。

原因

注意任何异常都只能给当前进程造成影响,不会波及其他进程。

为什么/0和野指针会导致进程崩溃呢?这是因为当运行这种代码时,会给进程发送异常信号,导致进程崩溃。

为什么/0和野指针会给进程发送信号呢?在CPU里有一个寄存器叫状态寄存器,在状态寄存器里有一个溢出标志位,当在做/0操作时,那么就直接溢出了,而溢出标志位就由0变为1,从而被操作系统识别,之后操作系统就能对信息做出处理。

那么野指针呢?在操作系统里有一个页表用来转换虚拟地址和物理地址,而野指针就是地址转换失败。一旦失败,就会把失败地址传回CPU寄存器里。

总结:操作系统怎么知道是溢出异常还是段错误呢?本质就是因为不同的报错对应的是不同CPU寄存器(硬件)的报错。

五.软件条件

异常只会由硬件产生吗?答案是当然不是。

还记得管道吗?一个进程进行写入,另一个进程进行读取。如果我们将读端关掉,那么写端也会关闭并且会发送13号信号。这其实就算一种软件异常。

alarm

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

六.core文件

在这里插入图片描述

在这里插入图片描述

一个进程在使用wait退出时会返回对应退出码(8-15位),而进程异常会收到退出信号(0-6位),第7位是coredum,它表示进程在终止的时候表示是core终止方式还是term终止方式。

在这里插入图片描述

core

在这里插入图片描述

term(以2号信号终止)

在这里插入图片描述

我们发现两者的core位都是0,怎么回事呢?其实是云服务器上的core功能默认是关闭的。

查看

在这里插入图片描述

开启core

在这里插入图片描述

在这里插入图片描述

在这之后形成了一个core文件。

在这里插入图片描述

core文件里会记录具体哪一行代码出现错误。直接使用gdb就可以调试。实际上Core文件在很多时候都是被禁止的,因为一般公司里当一个服务器因为异常被关闭时它就会自动重启,而每次重启又遇到异常,就又会生成一个Core文件。计算机的速度很快,往往一瞬间就会重启很多次,从而导致生成多个Core文件把内存占满。

信号发送其实本质上是给进程的PCB发。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234439.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串函数-C语言

介绍 字符串函数&#xff0c;简单说&#xff0c;就是处理字符串的函数&#xff0c;头文件是string.h&#xff0c;以下是今天的讲解中会讲到的一系列字符串函数 头文件&#xff1a;#include<string.h>strlen&#xff1a;求字符串长度strcpy&#xff1a;拷贝字符串strcat&…

Docker自定义镜像

目录 回顾 镜像含义 DockerFile语法 自定义java项目镜像 创建一个空目录&#xff0c;在这个空目录中创建一个文件&#xff0c;命名为 DockerFile&#xff0c;将 java 项目打包成 jar 包&#xff0c;放到这个目录中 ​编辑 编写DockerFile文件信息 使用 docker build 构建…

jQuery_05 事件的绑定(尝试)

jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 jQuery如何绑定事件呢&#xff1f; 1. $("选择器").事件名称(事件处理函数) $("选择器") &#xff1a; 选择0或者多个dom对象 给他们添加事件 事件名称&#xff1a;就是js中事件名称去掉on的部…

SS8844T四通道 1/2 H 桥驱动芯片发,替代A4979,DRV8844,L6288,MP6527

SS8844T 提供四个可独立控制的 1/2 H 桥启 动器。 它可被用于驱动两个 DC 电机、一个步进 电机、四个螺线管或者其它负载。 针对每个通道 的输出驱动器通道由在一个 1/2 H 桥配置中进行配 置的 N 通道功率 MOSFET 组成。 SS8844T 在每个桥的通道上提供高达 2.5A 峰…

Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

明基|书客|松下护眼台灯值不值得买?爆款多维度测评揭晓!

随着近视率越来越高的现象&#xff0c;护眼台灯逐渐成为大多数家庭的日常所需&#xff0c;许多护眼台灯品牌为了降低价格吸引消费者而不惜大程度上降低材料品质&#xff0c;导致台灯寿命减短&#xff0c;光线变差等问题频发&#xff0c;这也让广大对于如何选择一款好的护眼台灯…

IDEA中的Postman!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

GAN:WGAN

论文&#xff1a;https://arxiv.org/pdf/1701.07875.pdf 发表&#xff1a;2017 WGAN 算法流程 从GAN 到 WGAN 的转变 相比于原始 GAN&#xff0c;WGAN 只需要修改以下几点&#xff0c;就能使得训练更稳定&#xff0c;生成质量更高&#xff1a; 1. 此时的判别器相当于做回归…

个人成长|普通人要想摆脱贫穷,一定要注意这3点

哈喽呀&#xff0c;你好&#xff0c;我是雷工。 身为普通人&#xff0c;没有背景&#xff0c;没有资源&#xff0c;也没有人脉&#xff0c;在什么都没有的情况下如何才能摆脱贫穷&#xff0c;让生活过得更好。 要想自我蜕变&#xff0c;摆脱贫穷&#xff0c;就必须注意以下3点。…

振南技术干货集:各大平台串口调试软件大赏(4)

注解目录 &#xff08;串口的重要性不言而喻。为什么很多平台把串口称为 tty&#xff0c;比如 Linux、MacOS 等等&#xff0c;振南告诉你。&#xff09; 1、各平台上的串口调试软件 1.1Windows 1.1.1 STCISP &#xff08;感谢 STC 姚老板设计出 STCISP 这个软件。&#xf…

sklearn 笔记:聚类

1 sklearn各方法比较 方法名称参数使用场景K-means簇的数量 非常大的样本数 中等簇数 簇大小需要均匀 Affinity Propagation 阻尼系数 样本偏好 样本数不能多 簇大小不均 MeanShift带宽 样本数不能多 簇大小均匀 谱聚类簇的数量 中等样本数 小簇数 簇大小均匀 层次聚类簇的数量…

【UE】透视效果

效果 步骤 1. 新建一个空白工程 2. 添加一个第三人称游戏和初学者内容包到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Perspective” 打开“M_Perspective”&#xff0c;设置材质域为后期处理 添加三个“SceneTexture”节点&#xff0c;场景纹理ID选项分别设置为“…