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对象不为空,那…

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

文章目录 前言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堆排序的时间复杂度问题 前言 在上一篇文章中&#…

TMS320F280049 ECAP模块--总览(0)

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

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

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

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源安装应用程序

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

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

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 亿欧元。 首次募资就募到了将…

《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题

其他无法解析的外部符号&#xff1a; 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl ML_AddinManger::metaObject(void)const "… 无法解析的外部符号 “public: virtual void * __cdecl ML_AddinManger::qt_metacast(char const *)” (?…

toefl listening_托福听力

x.1 课程介绍 x.1.1 课程介绍 考试介绍 注意事项如下&#xff0c; x.1.2 分数设定和方法论 x.2.1 细节题解法 x.2.2 对话主旨题解法 听力对话不要扣分&#xff1b; 内容主旨题&#xff0c;以what开头&#xff1b; 目的主旨题&#xff0c;以why开头&#xff1b; 目的主旨题…

SpringCloud中注册中心Nacos的下载与使用步骤

1.前言 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理&#xff0c;是面向微服务架构的一个重要组成部分。 2.下载 链接&#xff1a;https://pan.b…

奶茶店、女装店、餐饮店是高危创业方向,原因如下:

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 现在的俊男靓女们&#xff0c;心中都有一个执念&#xff1a; (1)想证明自己了&#xff0c;开个奶茶去…… (2)想多赚点钱了&#xff0c;加盟餐饮店去…… (3)工作不顺心了&#xff0c;搞个女装店去…… 但凡抱着…

回溯--字母迷宫

1.题目描述 字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid&#xff0c;请判断玩家是否能在 grid 中找到目标单词 target。 注意&#xff1a;寻找单词时 必须 按照字母顺序&#xff0c;通过水平或垂直方向相邻的单元格内的字母构成&#xff0c;同时&#xff0c;同一个单…

Windows系统下DOS命令

Windows系统下DOS命令 1. 与文件操作相关1.1 mkdir&#xff0c;md命令1.2 rmdir、rd命令1.3 dir命令1.4 start命令1.5 echo命令1.6 type命令1.7 copy命令1.8 move命令1.9 copy和move的区别1.10 del命令1.11 rename命令1.12 attrib命令1.13 fsutil命令1.14 assoc命令 2. 与网络相…

数据持久化第六课-ASP.NET运行机制

数据持久化第六课-ASP.NET运行机制 一.预习笔记 1.动态网页的工作机制通常分为以下几个阶段&#xff1a; 1&#xff09;使用动态Web开发技术编写Web应用程序&#xff0c;并部署到Web服务器。 2&#xff09;客户端通过在浏览器中输入地址&#xff0c;请求动态页面。 3&#…

机器学习之数学基础(六)~时间复杂度和空间复杂度

目录 算法背景 background 1. 时间复杂度 Time Complexity 1.1 时间复杂度分类 1.1.1 O(1) 常数阶 1.1.2 O(n) 线性阶 1.1.3 O(n^2) 平方阶 1.1.4 O(logn) 对数阶 1.1.5 O(nlogn) 线性对数阶 1.1.6 O(2^n) 指数阶 1.1.7 O(n!) 阶乘阶 1.1.8 时间复杂度分类 1.2 时…

03-07Java自动化之JAVA基础之循环

JAVA基础之循环 一、for循环 1.1for循环的含义 for&#xff08;初始化语句;条件判断;条件控制或–&#xff09;{ ​ //代码语句 } 1、首先执行初始话语句&#xff0c;给变量一个起始的值 2、条件判断进行判断&#xff0c;为true&#xff0c;执行循环体中的代码语句 ​ …