LInux-信号1

news2024/12/24 3:32:14

文章目录

  • 前言
  • 一、信号是什么?
  • 二、学习步骤
    • 使用kill -l命令查看信号列表
        • 可以看到有那么多信号,那么进程是如何识别这么多信号的呢?
    • 使用kill命令终止进程
    • 信号的捕捉
        • kill函数
        • raise函数
        • abort函数
    • Core dump
        • 如何查看自己的核心转储功能是否被打开?
        • 如何打开核心转储功能?
    • 由软件条件产生信号
    • 由硬件异常产生信号


前言

本章主要讲信号的产生与处理以及信号的作用,再延展出core dump的相关概念,信号对于进程十分重要。


一、信号是什么?

信号在我们的日常生活中也应用广泛,如信号灯,当绿灯亮起,我们就知道这条马路我们可以通行。我们今天所学习的信号也是同样的作用,是要让进程接受到不同信号所进行不同的处理方式。

二、学习步骤

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

在之前学习进程状态的时候,我们就曾使用过kill命令来终止进程,而kill命令就是专门用来给进程发送信号的,那么常见的信号有哪些?
可以通过在shell输入

kill -l

信号列表

可以看到有那么多信号,那么进程是如何识别这么多信号的呢?

在每一个进程的PCB中都存储相对应的信号位图结构,那么我们就可以大概知道,这种位图结构只需要由0置1就可以实现对信号的接受,而实际上也就是如此。

我们再来看上面这幅图,左边是它们的信号编号,右边则是它们的宏名称。
在这里插入图片描述

我们今天所讨论的是1-31的信号,其中34以上的信号为实时信号,不在我们本章的学习范畴中。

使用kill命令终止进程

我们可以先写一个死循环程序,使用kill终止进程
在这里插入图片描述
在这里插入图片描述
右侧在跑死循环程序,左侧使用ps axj命令查看运行进程的pid,再使用kill -2 pid命令来终止该进程。

所以这里我们就是对目标进程使用2号信号来终止该进程。

信号的捕捉

进程对于信号有三种处理方式:
1.默认处理
2.忽略(忽略也是一种处理方式,一般是等到合适的时间再进行信号处理)
3.自定义(捕捉信号)

对于信号的捕捉,系统给了我们这样一个接口函数,使用man 2 signal查看signal函数
在这里插入图片描述
这里的sighandler_t是函数指针。

signal函数的主要作用就是用于自定义捕捉信号,将signum的信号处理方式变换成handler的处理方式

代码如下(示例):

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<signal.h>

void catchSign(int signum)
{
    std::cout << "捕捉到" << signum << "号信号 pid:" << getpid() << std::endl;
}
int main()
{
    signal(SIGINT,catchSign);
    //signal(2,catchSign);
    while(true)
    {
        std::cout << "hello " << getpid() << std::endl; 
        sleep(1);
    }
    return 0;
}

运行这一串代码之后,我们再尝试使用kill -2 pid 命令,就会发现
在这里插入图片描述
进程收到2号信号后不是终止进程,而是打印出我们catchSign的内容
然后如果你这个时候先想用ctrl+C来终止进程,你会发现也无法终止进程
在这里插入图片描述
这是为什么? 因为ctrl+C这一组合键就是被OS识别为向前台进程发送2号信号!
我们还可以使用ctrl+\来终止进程。而ctrl+\其实也是被OS识别为向前台进程发送3号信号。

kill函数

在这里插入图片描述
shell命令有kill命令,C语言也提供了一个kill函数,可以向pid进程发送sig号命令。

raise函数

在这里插入图片描述
这个函数也是C语言提供的函数,用于对自己这个进程发送sig信号。

abort函数

在这里插入图片描述abort函数使当前进程接收到(6)SIGABRT信号而异常终止。

Core dump

通过在shell输入 man 7 signal我们可以看到
在这里插入图片描述
Term代表终止,那么Core呢? 我们刚刚也尝试使用了3号信号,进程仍然也终止了。这里的Core其实是指 触发该信号可能会发生Core dump(核心转储).

曾经我们在学习进程退出的时候,我们对于进程的退出状态有过探讨,如果进程由于收到信号异常退出,第8个bit位为core dump标志。 所以,核心转储到底是什么? 它其实是为了保护进程在运行过程中所产生的数据,将内存的数据转储到磁盘中, 这就是核心转储!

示例代码:

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<signal.h>
#include<wait.h>
int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        sleep(1);
        std::cout<<"子进程 " << getpid() << ":即将异常退出" << std::endl;
        raise(SIGQUIT);
    }
    int status = 0;
    waitpid(id, &status, 0);
    std::cout << "父进程: " << getpid() << " 子进程: " << id << " exit sign: " <<\
    (status & 0x7F) << " is core: " << ((status >> 7) & 1 ) << std::endl;
    return 0;
}

这段代码主要是让子进程向自己发送3号信号,并且3号信号是Core,父进程用status接收子进程的退出状态,通过按位与和右移bit位的方式,我们分别可以得到子进程退出时收到的信号和Core dump位。

运行如下
在这里插入图片描述

奇怪了,为什么这里的core还是0呢? 实际上是因为我这里使用的是远端云服务器,而在云服务器上,核心转储功能是被默认关闭的!如果你使用的是虚拟机,虚拟机是默认打开的!

如何查看自己的核心转储功能是否被打开?

在shell输入ulimit -a命令
在这里插入图片描述

如何打开核心转储功能?

在shell输入ulimit -c size

需要注意的是core file的单位是block,因为要存储进程中所产生的数据还是要一定的磁盘空间来存储的,所以size不能太小。
在这里插入图片描述
注意:如果这里修改core file size 失败,尝试使用sudo来添加root权限。

这次我们打开了核心转储功能,再来试试上面的代码运行结果是否不同。
在这里插入图片描述
这次我们的core dump位成功为1,并且我们当前路径下还多出了一个core文件,该文件为二进制文件。

由软件条件产生信号

顾名思义,就是达到软件某种条件则会产生的信号,我们以alarm和SIGALRM信号为例。

先来看看alarm函数
在这里插入图片描述
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。

像alarm给进程设一个闹钟,当闹钟时间到了,达到了设定条件就发送信号,就叫做由软件条件产生信号。

通过alarm我们可以来测一测我们cpu每秒运算能力。

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<signal.h>
#include<wait.h>

long long count = 0;

void catchALRM(int signum)
{
    std::cout << "count: " << count << std::endl;
    alarm(1);
}

int main()
{
    signal(SIGALRM,catchALRM);
    alarm(1);

    while(1)
    {
        ++count;
    }
    return 0;
}

在这里插入图片描述
这就是我的云服务器的cpu运算能力。

由硬件异常产生信号

对于我们而言最常见的就是除0的浮点数异常和野指针所产生的越界访问的异常。
这种其实是硬件上所发现的异常,然后再对进程发送终止信号。

先说SIGFPE浮点数异常信号,大家应该都知道我们程序内部进行的运算都是由cpu进行的,当出现除0时,cpu的状态寄存器会记录浮点数错误,然后OS在计算完毕后进行检查就会发送对进程发送SIGFPE信号。

野指针也是一样的,我们的进程中的虚拟内存的数据要映射到物理内存,会经过MMU(Memory Manager Unit内存管理单元)发现越界访问,也就发送对应的SIGSEGV信号,Segmentation violation段错误。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生】持续集成持续部署

本文主要总结CI/CD的流程&#xff0c;不会详细介绍每个知识点。 啥是集成&#xff1f;啥是部署&#xff1f; 集成&#xff0c;就是把应用程序、相关环境、配置全局打包放在一个容器中的操作。部署就不解释了。 CI/CD 如果是自己手动部署的话&#xff0c;流程应该是这样的&am…

Open CASCADE学习|计算全局属性

对于一个系统全局属性有&#xff1a; 质量(mass) 质心(mass center) 惯性张量(matrix of inertia) 关于一个轴的矩(moment about an axis) 关于一个轴的惯性半径(radius of gyration about an axis) 惯性的主属性&#xff0c;比如主轴(principal axis)&#xff0c;主矩(pr…

算法-搜索二维矩阵 II

1、题目来源 240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#x…

Linux:Jenkins:GitLab+Maven+Jenkins的部署——离线包rpm版

Linux&#xff1a;Jenkins&#xff1a;GitLabMavenJenkins的部署&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136157018?spm1001.2014.3001.5501这个是原版文章&#xff0c;均是使用的在线情况&#xff0c;但是不排除会有离线部署&am…

LaTex和Word中推荐使用的矢量图片格式

1、LaTex 推荐使用eps矢量格式。&#xff08;该格式直接放在word中不会显示&#xff0c;但是通过插入word后双击打开查看 2、Word 推荐使用svg矢量格式。该格式可以直接插入word中。 3、plt保存代码 import matplotlib.pyplot as plt# 绘制图形 x [1, 2, 3, 4, 5] y1 [1…

重新安装VSCode后,按住Ctrl(or Command) 点击鼠标左键不跳转问题

重新安装VSCode后&#xff0c;按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转问题 原因&#xff1a;重新安装一般是因为相应编程语言的插件被删除了或还没有下载。 本次是由于Python相关的插件被删除了&#xff0c;因此导致Python无法跳转。 解决办法 在vs…

挑战杯 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

idm直链怎么用 IDM直链下载风险 Internet Download Manager下载 idm官网登录 idm直链提取

作为一款备受好评的下载加速器&#xff0c;idm几乎可以胜任所有的下载场景。无论是直链资源、磁力链接还是种子文件&#xff0c;idm均能把它们高速下载到本地保存。并且&#xff0c;理论上idm可以将下载速度提高3至5倍。有关idm直链怎么用&#xff0c;IDM直链下载风险的相关问题…

FFmpeg的HEVC解码器源代码学习笔记-1

一直想写一个HEVC的码流解析工具&#xff0c;看了雷神264码流解析工具&#xff0c;本来想尝试模仿写一个相似的265码流分析工具&#xff0c;但是发现265的解码过程和结构体和264的不太一样&#xff0c;很多结构体并没有完全暴露出来&#xff0c;没有想到很好的方法获得量化参数…

挑战杯 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xf…

小程序--引入vant组件库

一、npm初始化 在微信开发者工具中打开终端&#xff0c;输入npm init&#xff0c;对npm进行初始化 二、安装vant组件库 npm install vant/weapp 三、修改app.json 修改 app.json&#xff0c;移除全局配置 "style": "v2"&#xff0c;否则 Vant 组件的样式…

R cox回归 ggDCA报错

临床预测模型的决策曲线分析&#xff08;DCA&#xff09;&#xff1a;基于ggDCA包 决策曲线分析法&#xff08;decision curve analysis&#xff0c;DCA&#xff09;是一种评估临床预测模型、诊断试验和分子标记物的简单方法。 我们在传统的诊断试验指标如&#xff1a;敏感性&a…

Hive的UDF开发之向量化表达式(VectorizedExpressions)

1. 背景 笔者的大数据平台XSailboat的SailWorks模块包含离线分析功能。离线分析的后台实现&#xff0c;包含调度引擎、执行引擎、计算引擎和存储引擎。计算和存储引擎由Hive提供&#xff0c;调度引擎和执行引擎由我们自己实现。调度引擎根据DAG图和调度计划&#xff0c;安排执…

2024年天津高考数学备考:历年选择题真题练一练(2014~2023)

距离2024年高考还有不到四个月的时间&#xff0c;今天我们来看一下2014~2023年的天津市高考数学的选择题&#xff0c;从过去十年的真题中随机抽取5道题&#xff0c;并且提供解析。后附六分成长独家制作的在线练习集&#xff0c;科学、高效地反复刷这些真题&#xff0c;吃透真题…

K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

docker 镜像仓库实战

“面对脆弱的玩笑” 悉知Docker镜像仓库的命令后&#xff0c;我们总得将这些命令使用起来&#xff0c;在实践中深刻理解执行这些命令的实际效果。 综合实战1: 搭建一个Nginx服务 至于Nginx是什么&#xff0c;我想在这一篇中已经有过讲解: Nignx服务&#xff0c;也并非本篇要详…

基于springboot+vue的课程答疑系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

YOLOv5代码解读[02] models/yolov5l.yaml文件解析

文章目录 YOLOv5代码解读[02] models/yolov5l.yaml文件解析yolov5l.yaml文件检测头1--->耦合头检测头2--->解耦头检测头3--->ASFF检测头Model类解析parse_model函数 YOLOv5代码解读[02] models/yolov5l.yaml文件解析 yolov5l.yaml文件 # YOLOv5 &#x1f680; by Ult…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…

shell基础实验(1)

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 1.1.安装邮件服务,配置邮件服务 [rootserver ~]# yum install mailx -y[rootserver ~]# vim /etc/mail.rc set from1580540058qq.com …