【Linux系统】信号的产生

news2024/9/24 9:23:05

信号

关于信号举一些生活中的例子 --- 比如交通指示灯...

 - 信号在生活中,随时可以产生 --- 信号的产生和我们是异步的!(异步的意思就是信号的产生和我没有直接关系)

- 你能认识这个信号 --- 我们知道这是信号,我们才知道如何处理!

- 我们知道信号产生了,信号该怎么处理! --- 我们应该知道如何处理!

- 我们可能在做着更重要的事情,把到来的信号暂不处理 --- 1.我得记得这个事。2.什么时候处理?合适的时候!!!

那么转回我们的OS中,上面的“我”不就是进程吗!!!

在OS中有31个普通信号,后面35-64为实时信号,我们主要研究普通信号

使用kill -l 命令列出信号列表

信号概念的基本储备

信号:Linux系统提供的一种,向指定进程发送特定事件的方式,做识别和处理。

信号产生是异步的!

信号处理:1.默认动作 2.忽略动作 3.自定义处理 --- 信号的捕捉

进程处理信号,都是默认的 --- 默认动作通常:终止自己、暂停、忽略...

man 7 signal 查看各种信号的信息

 如何理解信号的保存和处理呢?

每个进程都有task_struct的结构体,其中有一个成员变量拥有32个比特位,那么保存就可以使用这些比特位,这就是使用位图来进行信号的保存,保存收到的信号!

发送信号:修改指定进程的PCB中的信号的指定位图,0变为1,写信号!

信号的产生

1.通过kill命令,向指定的进程发送指定的信号。

kill -9 pid --- -9代表要发送的信号,在信号表中,pid代表要发送给哪个进程号

2.键盘可以产生信号。

比如ctrl + c代表kill -9,ctrl + \代表3号信号SIGQUIT

3.系统调用。

kill --- 给指定进程发送指定信号

 raise函数 --- 给当前进程发送指定信号(内部其实本质是封装了系统调用)

abort函数 ---  执行的是6号信号SIGABRT(内部其实本质是封装了系统调用)

 signal --- 自定义捕捉指定信号,去执行handler函数,改变了默认的终止进程的动作

 测试一下signal

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

void handler(int sig)
{
    std::cout << "get a sig:" << sig << std::endl;
}
int main()
{
    signal(SIGABRT, handler);
    while (true)
    {
        std::cout << "my pid is:" << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}

 

 以上总总只为证明:真正发送信号的其实是谁,是OS!!!

思考:如果我们把所有信号都捕捉了,如何终止进程?

OS也想到了这个问题! --- 9号信号不允许被自定义捕捉

如何理解上面的信号发送?

不就是通过给指定进程发送指定信号,让指定进程做出相应反应吗?

4.软件条件

管道,当管道读端关闭,写端一直写,OS会发送13号SIGPIPE信号终止这个进程!

alarm --- 设置多少秒后再执行相应信号SIGALRM --- 设置一次就默认触发一次

测试代码:

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

int cnt;

void handler(int sig)
{
    std::cout << "get a sig:" << sig << std::endl;
    exit(1);
}
int main()
{
    signal(SIGALRM, handler);
    alarm(3);
    while (true)
    {
        std::cout << "my pid is:" << getpid() << std::endl;
        cnt++;
        std:: cout << "cnt:" << cnt << std::endl;
        sleep(1);
    }
    return 0;
}

 alarm可以设置闹钟,多少秒后执行结束

alarm(0):取消闹钟

alarm还可以每隔一秒发送一次信号!

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

int cnt;

void handler(int sig)
{
    alarm(1);
    std::cout << "cnt:" << cnt << " get a sig:" << sig << std::endl;
}
int main()
{
    signal(SIGALRM, handler);
    alarm(1);
    while (true)
    {
        //std::cout << "my pid is:" << getpid() << std::endl;
        cnt++;
        std:: cout << "cnt:" << cnt << std::endl;
        sleep(1);
    }
    return 0;
}

 验证IO --- IO很慢

while循环进行打印++现象

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

int cnt;

void handler(int sig)
{
    std::cout << "cnt:" << cnt << " get a sig:" << sig << std::endl;
    exit(1);
}
int main()
{
    signal(SIGALRM, handler);
    alarm(1);
    while (true)
    {
        //std::cout << "my pid is:" << getpid() << std::endl;
        cnt++;
        std:: cout << "cnt:" << cnt << std::endl;
        //sleep(1);
    }
    return 0;
}

while循环不打印进行++现象

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

int cnt;

void handler(int sig)
{
    std::cout << "cnt:" << cnt << " get a sig:" << sig << std::endl;
    exit(1);
}
int main()
{
    signal(SIGALRM, handler);
    alarm(1);
    while (true)
    {
        //std::cout << "my pid is:" << getpid() << std::endl;
        cnt++;
        //std:: cout << "cnt:" << cnt << std::endl;
        //sleep(1);
    }
    return 0;
}

明显后者更快!!!

为什么这样?这是因为当我们使用cout打印到显示器上的时候,是需要拷贝的,再者我们用的是云服务器,从远端服务器上推送到本地是有很大消耗的!!!所以IO很慢!!! 

理解闹钟

我们可以设置很多闹钟,那我们OS要不要对闹钟进行管理呢?

操作系统要对闹钟进行管理,先描述,再组织!

 其实闹钟就是一个结构体

struct alarm

{

        time_t expired;//未来的超时时间=second + Now();

        pid_t pid;

        func_t f;

        ...

};

描述有了,如何组织呢?

我们是不是可以让闹钟按超时时间进行排序,那我们可以使用小根堆,堆顶元素超时我们就pop!!!

闹钟的返回值

alarm的返回值是上一次设置的闹钟到这次设置的闹钟剩余的时间!

所以产生信号其实是系统调用alarm,发送信号是OS发的!!!

5.异常

程序为什么会崩溃???非法访问,操作 ---> 程序出现了异常,OS给进程发送信号了!!

程序崩溃了为什么会退出?--- 信号默认处理是终止进程

可以不退出吗?可以,使用signal捕捉该异常,但我们通常都推荐终止进程!

为什么推荐终止进程? --- 释放进程的上下文数据,包括溢出标志数据或者其他异常数据!

算术运算,逻辑运算原理 

 当我们进行10/0运算时,CPU如何得知运算是正常的还是异常的?

其实在CPU内部有很多的寄存器,有个可以状态寄存器内部有溢出标记位,标记为0,会把计算结果写回到内存,如果标记位为1,就说明运算出现了异常,CPU内部就会出现报错! 

那OS是软硬件资源的管理者,OS要随时处理这种硬件问题! --- 向目标进程发送指定信号!!!

那么回到为什么出现异常推荐终止进程呢?终止进程本质上是释放进程的上下文数据,包括溢出标志数据或者其他异常数据!

野指针为什么捕捉后一直报错?11号信号SIGSEGV

 Core、Term怎么理解?

term代表异常终止,没什么好说的!

core --- 异常终止但是他会帮我们形成一个Debug文件 --- 进程退出的时候的镜像数据!!

---  核心存储

云服务器默认是把core文件关掉的!!

我们来打开

 

 

 会同时为我们生成一个core文件,在Ubuntu下如果运行多次进程出现多次错误会只有1个core文件,而Centos中会有后缀pid跟着,故多次运行会产生多个core文件!!!

 云服务器为什么要关闭核心存储?

所以云服务器为什么要关闭,因为当我们执行错误代码,无意下多次执行的话,可能会造成大量的core文件,这可能会影响云服务器的正常运行,故默认是关闭的!

之前的退出码与信号码之间的core dump标志位就有了解释,1代表开启即Core,0代表关闭即Term!!

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

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

相关文章

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

AES Android IOS H5 加密方案

前景&#xff1a; 1、本项目原有功能RSA客户端对敏感信息进行加密 2、本次漏洞说是服务端返回值有敏感信息&#xff0c;需要密文返回 方案&#xff1a; 本次方案不算完美&#xff0c;还是有被劫持篡改的风险&#xff0c;但基本https证书认证加持&#xff0c;风险相对较小 …

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;又成为调停者模式&#xff0c;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用&#xff0c;从而使其耦合…

颈动脉血管壁分割通过领域对齐、拓扑学习和稀疏标注中的Segment Anything模型在磁共振图像中的应用。

Title 题目 Carotid Vessel Wall Segmentation ThroughDomain Aligner, Topological Learning, andSegment Anything Model for Sparse Annotationin MR Images 颈动脉血管壁分割通过领域对齐、拓扑学习和稀疏标注中的Segment Anything模型在磁共振图像中的应用 01 文献速递…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

C语言 ——— 大/小端存储模式的介绍及判断

目录 何为大端小端 如何测试当前机器是大端还是小端 编写代码&#xff0c;判断当前机器的字节序 何为大端小端 大端字节序存储模式&#xff1a;数据的低位字节的内容 存放在 内存的高地址 中&#xff0c;数据的高位字节的内容 保存在 内存的低地址 中 小端字节序存储模式&am…

台达DVP系列串口驱动全面解析

1 驱动简介 台达DVP系列PLC&#xff08;包括ES2、SS、EX等&#xff09;使用串口通讯&#xff0c;外部设备可通过此口采集与PLC进行数据交互。网关使用台达DVP系列驱动&#xff0c;按照下述过程操作即可实现网关与PLC直接通讯 默认串口参数&#xff1a;9600/7/偶/1。 串口号&…

支持前端路由权限和后端接口权限的企业管理系统模版

一、技术栈 前端&#xff1a;iview-admin vue 后端&#xff1a;springboot shiro 二、基于角色的权限控制 1、路由权限 即不同角色的路由访问控制 2、菜单权限 即不同角色的菜单列表展示 3、按钮权限 即不同角色的按钮展示 4、接口权限 即不同角色的接口访问控制 三…

SQLMC:一款高性能大规模SQL注入安全扫描工具

关于SQLMC SQLMC是一款功能强大的高性能SQL注入安全扫描工具&#xff0c;该工具作为Kali Linux官方内置工具的其中一个部分&#xff0c;可以帮助广大研究人员检测目标域名的所有URL节点是否存在SQL注入问题。 该工具基于纯Python开发&#xff0c;适用于红队和蓝队成员&#xf…

path模块和HTTP协议

一。path模块常用API ./相对路径&#xff0c;/绝对路径 二&#xff0c;HTTP协议 1.请求报文 1.请求行 URL的组成 2.请求头 3.请求体 可以是空&#xff1a;GET请求 可以是字符串&#xff0c;还可以是json&#xff1a;POST请求 2.响应报文 1.响应行 HTTP / 1.1 200 OK H…

为什么讨厌Java的人比较多且易见?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;1. 我对OO理解的入门是从Java的…

谈谈大数据采集和常见问题

01 什么是数据采集 数据采集是大数据的基石&#xff0c;不论是现在的互联网公司&#xff0c;物联网公司或者传统的IT公司&#xff0c;每个业务流程环节都会产生大量的数据&#xff0c;同时用户操作的日志也会产生大量的数据&#xff0c;为了将这些结构化和非结构化的数据进行…

负载测试和功率分析中负载箱的重要作用

在负载测试和功率分析中&#xff0c;负载箱扮演着至关重要的角色。以下是负载箱在这两个方面的重要作用&#xff1a; 一、负载测试中的重要作用 模拟实际负载条件&#xff1a; 负载箱能够模拟各种复杂的负载条件&#xff0c;包括电阻性负载、电感性负载、电容性负载等&#x…

基于springboot和mybatis的RealWorld后端项目实战二之实现tag接口

修改pom.xml 新增tag数据表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for tags -- ---------------------------- DROP TABLE IF EXISTS tags; CREATE TABLE tags (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,PR…

卷积加速算法img2col、Winograd、FFT

FFT 空间域中矩阵的卷积算子&#xff0c;实际等于频率域中两个矩阵元素相乘。但卷积的方向是相反的。 通常情况下&#xff0c;feature的尺寸要比卷积的尺寸大很多&#xff0c;如果对两者进行快速傅里叶变换的话&#xff0c;得出来的两个矩阵大小不一样&#xff0c;不能进行对…

Java读写t5557卡源码

T5557卡是美国Atmel公司生产的多功能非接触式射频卡芯片&#xff0c;属于125KHz的低频卡&#xff0c;在国内有广大的应用市场。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操作模式的参数配置块。第0页第7块可以作用户数据块…

ATA-8202射频功率放大器有什么作用

射频功率放大器是一种专门用于放大射频信号功率的电子器件。它在无线通信、雷达系统、卫星通信、医疗设备和广播电视等领域中发挥着重要作用。下面安泰电子将介绍ATA-8202射频功率放大器的作用及其在不同应用领域中的具体应用。 一、ATA-8202射频功率放大器的作用 射频功率放大…

短链接day8

短链接监控 开发访问单个短链接监控统计功能 不知道是哪里复制错了&#xff0c;反正就是一顿报错&#xff0c;改了这个又改那个&#xff0c;还是报错。。暂时不管了。 记录短链接访问日志 logdo新增networt、device、local属性。 分页查询短链接访问日志 分页查询短链接今…

使用Bind提供的域名解析服务

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、DNS域名解析服务 二、安装Bind服务程序 1、正向解析 2、反向解析 三、部署从服务器 四、安全的加密传输 五、部署缓存服务器 六、分…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…