LINUX系统编程:信号(1)

目录

什么是信号?

为什要有信号呢?

进程接受信号的过程

1.信号的产生

1.1kill命令产生信号

1.2键盘产生信号

1.3系统调用接口

1.3.1killl()

1.3.2raise()

1.3.3abort()

1.4软件条件

1.5异常

1.6对各种情况产生信号的理解

1.6.1kill命令

1.6.2键盘产生信号

1.6.3异常

除零错误

野指针


信号和信号量是两个完全不相干的技术,不要混淆。

什么是信号?

Linux让系统提供让用户给其他进程异步发送消息的一种方式。

站在进程的角度看待信号

1.信号在没被发送之前,进程是认识这个信号。

2.在接受到信号之后,进程是被设定好去怎么处理这个信号的。

3.信号到来的时候,如果进程有更重要的事情要做,这个信号会被临时保存。

4.收到信号之后可以不立即处理,等到机会合适在处理信号。

5.信号产生是不定时,随时都可能接受到信号,所以信号是异步发送的,是别的用户和进程。

为什要有信号呢?

操作系统要求进程有对外部信号响应的能力。(例:该进程发生除0错误,这个时候操作系统就会给进程发信号,让其停止)。

进程接受信号的过程

1.信号的产生

信号是如何产生的呢?

1.1kill命令产生信号

1-34都是标准信号,34之后的是实时信号。

其中每个数字都是一个宏,使用kill命令可以 kill -9 也可以 kill -SIGKILL

1.2键盘产生信号

ctrl + c 和 ctrl + \

信号捕捉:当我们向进程发送一个信号,进程接受信号后,会做出系统设定好的动作,

捕捉信号就是将这个信号的默认动作,改为自定义的动作。

signal(2,handler);

第一个参数就是要捕捉的信号,第二个参数为int,返回之为void的函数指针,捕捉到信号之后,就执行handler函数。

demo代码

大概意思就是进程收到2号信号时,会把2号信号的默认动作替换为handler函数。

#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <signal.h>using namespace std;void handler(int sig)
{cout<<endl;cout<<"get a signal ,number is:"<< sig <<endl;//打印捕捉到的信号exit(0);
}int main()
{signal(2,handler);//捕捉2号信号while(true){;}return 0;
}

把程序跑起来,然后ctrl + c,进程果然接受到了2号信号。

ctrl + \ 会对进程发送3号信号 SIGQUIT

采用同样的方法,只不过把捕捉信号2,换成捕捉信号3。

1.3系统调用接口

1.3.1killl()

这个不是命令,是系统调用接口

kill()系统调用接口,能被用于发送任意信号,给任意的进程。

参数pid就是要发送信号进程的pid,sig就是发送几号信号。

成功返回0,失败-1被返回,适当的错误码被设置。

1.3.2raise()

对当前进程发送信号

成功返回0,失败返回非0.

1.3.3abort()

终止进程。

1.4软件条件

我的理解就是,软件触发了某种条件,导致需要操作系统介入发送信号。

例:管道写端关闭时,读端就会收到13号信号

现打开服务端,再打开客户端,客户端向管道写入,服务端从管道中读取。

关闭读端,看写端收到的信号。

果然收到了13号信号。

alarm(警报)

参数seconds:在多少秒之后警报会响起。

发送SIGALRM信号给调用进程,在参数seconds秒。

如果参数seconds是0,任何还未响应的警报会被删除。

在任何情况下,之前设置的警报都会被取消。

返回之前设定好警报的剩余时间,如果之前没设置返回0.

demo代码:设置一个5秒的警报

void handler(int sig)
{cout<<"get a signal, number:"<< sig <<endl;exit(0);
}int main()
{alarm(5);signal(14,handler);int cnt = 5;while(cnt){   cout<<cnt<<endl;sleep(1);cnt--;}return 0;
}

5秒之后收到14号信号。

1.5异常

这里就不验证了

例:除0错误 8)SIGFPE

        野指针 11) SIGSEGV

1.6对各种情况产生信号的理解

1.6.1kill命令

命令本身就是一个可执行的程序,本质就是使用了系统调用接口kill,让操作系统发送信号。

1.6.2键盘产生信号

操作系统怎么知道键盘输入了什么数据呢?

难道轮训的去查看键盘输入吗?这样效率也太低下了。

首先计算机启动时,会创建一个中断向量表,这是一个函数指针数组。

cpu是有很多针脚的,每个针脚都有自己的编号,其中键盘是直接与cpu2号针脚相连。

当键盘输入的时候,就会发生硬件中断,2号针脚就会产生高电平,操作系统拿着这针脚号,去中断向量表中,执行对应函数就可以读取到键盘的数据了。

读取键盘数据之后,要判断一下,如果是组合键,就执行对应的命令,如果是字符,就向对应文件的缓冲区写入。

1.6.3异常
除零错误

demo代码

void handler(int sig)
{cout<<"/0 error"<<endl;
}int main()
{signal(8,handler);int a = 10;int b = a/0;return 0;
}

这个代码有个奇怪的现象,运行起来发现cout<<"/0 error"<<endl;会一直打印,这是为什么呢?

一个原因是我捕捉之后没有退出,即使不退出也不应该循环打印。

进程将10写入eax中,0写入ebx中,eax和ebx相除,发生除零错误(硬件上的错误),发生错误之后,溢出标志位会被设置为1,这时候os看见cpu出问题了,就给进程发送了 SIGFPE 让其停止。

cpu中是有很多组数据的,liunx是分时操作系统,cpu会在不同的进程来回切换,每当切换到除零错误这个进程,os一看出现错误,就会发送一次信号,切换到一次就会发送一次信号。

野指针

demo代码

void handler(int sig)
{cout<<"pointer error"<<endl;exit(0);
}int main()
{signal(11,handler);int * p = nullptr;*p = 100;return 0;
}

首先eax拿到0号地址,发现要对0号地址进行写入,mmu就拿着0号地址,和cr3中的页表起始地址,进行转化,发现根本转化不了,因为0号地址的区域是只读的,或者访问的区域压根没到0号地址,就会将出错的地址储存在cr3中,os一看不对劲,赶紧给进程发SIGSEGV信号,让进程停止。

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

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

相关文章

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年&#xff0c;LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词&#xff0c;诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”&#xff0c;指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下&#xff0c;以太坊联…

SpringBoot登录认证--衔接SpringBoot案例通关版

文章目录 登录认证登录校验-概述登录校验 会话技术什么是会话呢?cookie Session令牌技术登录认证-登录校验-JWT令牌-介绍JWT SpringBoot案例通关版,上接这篇 登录认证 先讲解基本的登录功能 登录功能本质就是查询操作 那么查询完毕后返回一个Emp对象 如果Emp对象不为空,那…

The Missing Semester ( Shell 工具和脚本 和 Vim)

管道符号 &#xff08;1&#xff09;管道符号 | 将前一个命令的输出作为下一个命令的输入 例如&#xff1a; 以下为 ./semester输出中提取包含 "Last-Modified" 的行并写入文件 last-modified.txt./semester | grep "Last-Modified" > ~/last-modif…

【数据结构】详解堆的基本结构及其实现

文章目录 前言1.堆的相关概念1.1堆的概念1.2堆的分类1.2.1小根堆1.2.2大根堆 1.3堆的特点堆的实用场景 2.堆的实现2.1初始化2.2插入2.3堆的向上调整2.4删除2.5堆的向下调整2.6判空2.7获取堆顶元素2.8销毁 3.堆排序3.1实现3.2堆排序的时间复杂度问题 前言 在上一篇文章中&#…

【ArcGIS微课1000例】0113:大地测量要素概述与构建

文章目录 一、大地测量要素描述1. 大地要素的概念2. 大地要素的类型二、创建大地测量要素1. 创建要素类2. 创建大地要素一、大地测量要素描述 1. 大地要素的概念 大地测量要素的测量值考虑了投影空间的固有变形。如果要创建一个空间跨度较大的要素(例如一条横跨大洋的飞行路…

TMS320F280049 ECAP模块--总览(0)

ECAP 特性&#xff1a; 4个32bit的事件时间戳寄存器&#xff1b; 4个连续时间戳捕获事件的边沿极性可选上升沿、下降沿 4个事件中每个都能触发中断 4个事件都能做单词触发 可以连续捕获4个事件 绝对的捕获时间戳 差异模式捕获 不使用捕获模式时&#xff0c;可以配置输出…

SIP通话分析

20240603 - 引言 分析SIP协议的时候&#xff0c;发现了几个问题。虽然说&#xff0c;从整体上来看这个SIP的通话流程也没麻烦&#xff0c;实际上从RFC的概述部分就已经基本上就已经了解了全貌。但在实际的场景中&#xff0c;很多字段起到的作用就不太一样了。 虽然一开始的时…

Python 图书馆管理系统 有GUI界面 【含Python源码 MX_031期】

使用python3&#xff0c;PyQt5&#xff0c;Sqlite3数据库搭建 主要功能&#xff1a; 用户注册、登录、修改密码、用户管理存储图书信息、采购增加和淘汰删除功能、租借功能实现图书采购、淘汰、租借功能。实现查询图书信息、采购和淘汰、库存、和租借情况实现统计图书的采购、…

发布 jar 包到 maven 中央仓库

目前开发基本都是以maven或者gradle的方式,直接引入依赖包即可,那么该咋那么发布我们自己的jar包到maven仓库,让别人使用呢?本文适用于2024.3之后的步骤 文章目录 账号准备第一步,注册账号第二步,新建命名空间第三步,验证命名空间第四步,创建 push 的账号和密码点击右…

使用docker安装mysql详细教程

一、Docker安装Mysql 1、启动Docker 启动&#xff1a;sudo systemctl start dockerservice docker start 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 1.默认拉取最新版本mysql dock…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

accelerate笔记:实验跟踪

Accelerate支持七种集成的跟踪器&#xff1a; TensorBoardWandBCometMLAimMLFlowClearMLDVCLive要使用这些跟踪器&#xff0c;可以通过在 Accelerator 类的 log_with 参数中传入所选类型来实现 from accelerate import Accelerator from accelerate.utils import LoggerTypeac…

高通开发系列 - ubuntu中的docker安装debian镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述当前状态Ubuntu中安装dockerDebian镜像Debian容器中操作更改Debian源安装应用程序

手机号脱敏

手机号脱敏 // 手机号脱敏subTelephone(telphone) {let result telphone.substr(0, 4) **** telphone.substr(8);return result;},

lua vm 四: 表达式

lua 的表达式有一些特殊情况。 1. 被括号包起来的表达式永远被当成一个值[1] (f(x,y,z))&#xff0c;即使 f 返回多个值&#xff0c;这个表达式永远是单个值。 2. 多返回值的调整[1] 函数调用和变长参数表达式都会产生多个值&#xff0c;这些表达式被称为多返回值表达式&…

每日复盘-20240603

20240603 六日涨幅最大: ------1--------300637--------- 扬帆新材 五日涨幅最大: ------1--------300637--------- 扬帆新材 四日涨幅最大: ------1--------301306--------- 西测测试 三日涨幅最大: ------1--------301306--------- 西测测试 二日涨幅最大: ------1--------30…

28 _ WebComponent:像搭积木一样构建Web应用

在上一篇文章中我们从技术演变的角度介绍了PWA&#xff0c;这是一套集合了多种技术的理念&#xff0c;让浏览器渐进式适应设备端。今天我们要站在开发者和项目角度来聊聊WebComponent&#xff0c;同样它也是一套技术的组合&#xff0c;能提供给开发者组件化开发的能力。 那什么…

【TB作品】MSP430F5529单片机,温控小风扇,DS18B20温度读取,PWM风扇

功能 /* OLED SCL ----------P3.0 SDA ----------P3.1 VCC ----------3.3V GND ----------GND 风扇 DATA ----------P2.4 VCC ----------3.3V GND ----------GND DS18B20 DATA ----------P1.5 VCC ----------3.3V GND ----------GND 功能&#xff1a; S1 改变占…

python 各种画图(2D 3D)-1 _matplotlib 官方网站笔记

背景 需利用python进行3D可视化处理&#xff0c;用于分析python得到的数据的正确性。 知识学习 python高阶3D绘图---pyvista模块&#xff0c;mayavi模块&#xff0c;pyopengl模块&#xff0c;MoviePy模块基础使用-CSDN博客 python用于3D绘图的模块比较多&#xff0c;pyvist…

目标2亿欧元!四年两次募资,全球最早专注于量子投资的Quantonation再次加码

Quantonation Ventures 是全球第一家专注于深度物理和量子技术的早期风险投资公司。4月10日&#xff0c;该公司宣布其第二只专门用于量子技术的早期基金 Quantonation II 首次募资完成&#xff0c;目前已募资 7000 万欧元&#xff0c;而目标为 2 亿欧元。 首次募资就募到了将…