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信号,让进程停止。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…

时序预测 | Matlab灰色-马尔科夫预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab灰色-马尔科夫预测 灰色马尔科夫预测&#xff08;Grey-Markov Prediction&#xff09;是一种用于时间序列预测的方法&#xff0c;它结合了灰色系统理论和马尔科夫链模型。灰色系统理论是一种非参数化的预测方法…

必看!硬核科普!什么是冻干?可以当主食喂的猫咪冻干分享

冻干猫粮作为近年来备受推崇的高品质选择&#xff0c;吸引了越来越多养猫人的目光。有着丰富养猫经验的我&#xff0c;早已开始采用冻干喂养。新手养猫的人可能会对冻干猫粮感到陌生&#xff0c;并产生疑问&#xff1a;这到底是什么&#xff1f;猫咪冻干可以天天喂吗&#xff1…

重新定义你的上网体验,微软WowTab助你一臂之力!

大家好&#xff0c;我是 Java陈序员。 浏览器是我们日常生活工作中必备的工具软件&#xff0c;使用非常频繁。 目前很多浏览器的新标签页虽然说功能齐全&#xff0c;但是充斥着广告和各种无效的信息&#xff0c;十分影响体验&#xff01; 今天&#xff0c;给大家安利一个浏览…

react 中使用 swiper

最近项目中需要用到轮播图&#xff0c;我立马想起了 swiper &#xff0c;那么本文就来带大家体验一下如何在 React 中使用这个插件&#xff0c;使用的是 函数组 hooks 的形式。 需求非常简单&#xff0c;就是一个可以自动播放、点击切换的轮播图&#xff08;跑马灯&#xff0…

基于jeecgboot-vue3的Flowable流程-待办任务(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接下来讲待办的流程处理 1、根据这个vue3新的框架&#xff0c;按钮代码如下&#xff1a; /*** 操作栏*/function getTableAction(record) {return [{label: 处理,onClick: handleProcess…

洗地机品牌哪个牌子好?避坑必读精析4大热门品牌优缺点

科技越发达&#xff0c;生活就越便捷。以打扫卫生为例&#xff0c;越来越多的人放弃了传统的扫把和拖把&#xff0c;转而选择更轻松的清洁家电&#xff0c;比如洗地机。洗地机不仅高效&#xff0c;还具有智能化设计&#xff0c;可以让清洁变得轻松。它强大的吸尘功能能够轻松应…

水位雨量监测站解析

水位雨量监测站是一种集水位和雨量监测功能于一体的重要气象和水文监测设备。其设计和功能旨在实时、准确地监测和记录河流水位、降雨量等关键数据&#xff0c;为气象、水文、环保等领域提供重要的信息支持。以下是关于水位雨量监测站的详细扩写&#xff1a; 系统组成 水位雨…

Midjourney绘画参数设置详解

在数字艺术和设计领域&#xff0c;Midjourney是一款强大的绘画工具&#xff0c;它允许艺术家和设计师以数字方式创作出精美的图像。为了充分发挥Midjourney的潜力&#xff0c;正确设置其绘画参数至关重要。本文将深入探讨Midjourney的绘画参数设置&#xff0c;帮助用户更好地掌…

掌握Element UI:加速你的网页设计过程!

Element UI 是一套为开发者、UI/UX设计师和产品经理准备的采用Vue 2.0作为基础框架实现的组件库&#xff0c;提供配套的设计资源&#xff0c;可以帮助设计快速成型。即时设计也内置Element UI Kit资源&#xff0c;但有些小伙伴还是对此不太了解&#xff0c;接下来本文会详细带你…

discuz论坛怎么修改备案信息

大家好&#xff0c;今天给大家分享下discuz如何填写备案信息并且展示在网站首页。大家都知道国内网站都需要备案&#xff0c;不通过备案的网站上是没办法通过域名打开的。大家也可以通过搜索网创有方&#xff0c;或者直接点击网创有方 查看悬挂备案号后的效果。 首先大家可以看…

STM32--ESP8266 WiFi模块

前言&#xff1a;此文所述模块为正点原子出版的ATK-ESP8266模块 一、特性参数 ATK-ESP8266 是 ALIENTEK 推出的一款高性能的 UART-WiFi&#xff08;串口-无线&#xff09;模块&#xff0c;ATK-ESP8266 板载了正点原子公司自主开发的 ATK-ESP-01 模块。 该模块是 ATK_ESP8266 的…

Flutter:革新移动开发的开源框架

在今天的移动应用开发领域&#xff0c;Flutter 已成为最受欢迎的开源框架之一。由 Google 开发并在 2017 年发布&#xff0c;Flutter 允许开发者使用单一代码库来构建跨平台的高性能应用&#xff0c;有效地覆盖了 iOS 和 Android 两大平台。接下来&#xff0c;我们将深入探索 F…

使用软件分享--剪映(不需要会员版)剪映 Jianying_pro_3_2_0_8778_beta9_jianyingpro_beta(Windows)

专栏介绍&#xff1a;本专栏主要分享一些实用的软件&#xff08;Po Jie版&#xff09;&#xff1b; 声明1&#xff1a;软件不保证时效性&#xff1b;只能保证在写本文时&#xff0c;该软件是可用的&#xff1b;不保证后续时间该软件能一直正常运行&#xff1b;不保证没有bug&am…

RocketMQ发送顺序消息原理与代码demo

RocketMQ 的顺序消息功能允许消息以发送的顺序被消费&#xff0c;这对于很多业务场景&#xff08;如交易处理、订单生成等, 或某些需要按照一定顺序执行的业务场景&#xff09;至关重要&#xff0c;因为这些场景下操作的执行顺序不能被打乱。顺序消息的实现需要确保消息在发送和…

【30天精通Prometheus:一站式监控实战指南】第10天:blackbox_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

【51单片机】智能百叶窗项目

文章目录 功能演示&#xff1a;前置要求&#xff1a;主要功能&#xff1a;主要模块&#xff1a;主函数代码&#xff1a; 具体的仿真程序和代码程序已经免费放置在资源中&#xff0c;如有需要&#xff0c;可以下载进行操作。 功能演示&#xff1a; 前置要求&#xff1a; 编译软…

Linux - 文件管理高级 find、grep

0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时&#xff0c;默认进行递归查找&#xff0c;会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …

MacOS13-将数据库转为markdown,docx格式

MacOS13-将数据库转为markdown&#xff0c;docx格式 文章目录 先说踩坑点各种模块缺失 代码效果总结参考 先说踩坑点 各种模块缺失 tkinter mysql 没错&#xff0c;你可以直接点击安装&#xff1b; 如果还出现报错 你需要打开终端 pip install mysqlclient再次点进去安…

C语言| 输出菱形*(梳理篇II)

C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后&#xff0c;写一遍程序才能发现问题所在。 容易犯的错误&#xff1a; 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数&#xff0c;分上三角形下三角形&#xff0c;只考虑左边的空格和星号* 2 上三角形 行数…