【Linux】信号的产生

目录

    • 一. 信号的概念
      • signal() 函数
    • 二. 信号的产生
      • 1. 键盘发送
      • 2. 系统调用
        • kill()
        • raise()
        • abort()
      • 3. 软件条件
        • alarm()
      • 4. 硬件异常
        • 除零错误:
        • 野指针:
    • 三. 核心转储

一. 信号的概念

  • 信号是消息的载体, 标志着不同的行为; 是进程间发送异步信息的一种方式, 属于软中断.

  • 信号随时都可能产生, 是异步发送的, 所以进程并不会立即处理信号, 进程会在合适的时间进行统一处理; 所以进程必须有保存信号的能力;

  • 信号是以位图的形式保存在 task_struct 的 pending 中, 当进程接受到信号时, 进程会将信号对应的位置设置为 1 即可;

struct task_struct {//...struct signal_struct *signal;	// 指向进程信号描述符struct sighand_struct *sighand;	// 指向进程信号处理程序描述符sigset_t blocked;  				// 进程阻塞的信号, 信号按照比特位相对应struct sigpending pending;		// 进程的待处理信号//...
};
  • 信号的处理方式分为三种:
    默认动作
    自定义动作;
    忽略.

在 Linux 中可以使用指令查看信号列表

kill -l

在这里插入图片描述
一共 62 个信号, 其中 1~31 号信号为普通信号, 适用于基于时间片的分时操作系统; 34~64 号信号为实时信号, 适用于实时操作系统.

使用指令可以查看普通信号的说明

man 7 signal

在这里插入图片描述

signal() 函数

在这里插入图片描述

  • signal() 函数, 可以将 signum 指定信号的处理动作, 设置为 handler 动作; 但 SIGKILL 和 SIGSTOP 不能被捕捉或忽略.
#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

参数:

  • signum: 信号编号, 设置的信号;
  • handler: 函数指针, 是信号的处理动作;
    若 handler 设置为 SIG_IGN, 那么设置的信号将会被忽略;
    若设置为 SIG_DFL, 那么信号将会执行默认动作;
    若设置为 自定义函数, 那么处理信号时, 将会调用自定义函数

返回值:

  • 若成功, 返回 signal handler 的前一个值; 若失败, 返回 SIG_ERR, 并且设置 erron.
    在这里插入图片描述

二. 信号的产生

1. 键盘发送

当操作系统从键盘中读取 “ctrl” + “c” 类似的特定的组合键时, 会将其解释为某种信号, 发送给前台进程.

  • 例:
    一个死循环的前台进程可以被 “ctrl” + “c” 终止,
#include <iostream>
#include <signal.h>using namespace std;int main()
{cout << endl;while (1) ;return 0;
}

在这里插入图片描述

将 2 号信号注册自定义行动 验证

#include <iostream>
#include <signal.h>
#include <unistd.h>using namespace std;void handler(int signal)
{cout << endl << getpid() << " " << signal << endl;
}int main()
{signal(2, handler);while (1) ;return 0;
}

在这里插入图片描述

2. 系统调用

kill()

在这里插入图片描述

  • kill() 函数, 发送指定信号至指定进程.
#include <sys/types.h>
#include <signal.h>int kill(pid_t pid, int sig);

参数:

  • pid: 指定的进程 pid;
  • sig: 指定的信号编号;

返回值:

  • 若成功, 返回 0; 若失败, 返回 -1, 并且设置 errno.
    在这里插入图片描述
raise()

在这里插入图片描述

  • raise() 函数, 发送指定信号至当前进程.
#include <signal.h>int raise(int sig);

参数:

  • sig: 指定的信号编号;

返回值:

  • 若成功, 返回 0; 若失败, 返回 非0, 并且设置 errno.
    在这里插入图片描述
abort()

在这里插入图片描述

  • abort() 函数, 发送 SIGABRT 信号至当前进程, 该函数从不返回.
#include <stdlib.h>void abort(void);

3. 软件条件

这种方式在管道就出现了:
管道读写时, 若读端关闭, 写端继续写入时, 那么操作系统将会发送 SIGPIPE 信号终止写端.

alarm()

在这里插入图片描述

  • alarm() 函数, 将会在指定时间后, 发送 SIGALRM 信号值当前进程.
#include <unistd.h>unsigned int alarm(unsigned int seconds);

参数:

  • seconds: 指定时间, 单位为秒;

返回值:

  • 若前一次 alarm() 函数没有剩余的时间, 返回 0; 若前一次 alarm() 函数有剩余的时间, 返回剩余的时间.
    在这里插入图片描述

4. 硬件异常

硬件异常是指 硬件在检测到错误条件后, 通知内核, 再由内核发送相应信号至相关进程.

除零错误:

当 CPU 发生除零错误后, CPU 会将内部的标志寄存器设置为 1, 表示出现数据异常; 之后通知操作系统, 由操作系统向进程发送 SIGFPE 信号, 该信号默认动作为终止程序;
但若将 SIGFPE 信号设置自定义动作或忽略, 未处理异常时, 该硬件的异常数据属于进程的上下文; 由于进程依旧运行, 并且状态寄存器依旧为异常状态, 那么操作系统会轮询式的发送异常信号至进程, 直至异常被处理或终止.

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>using namespace std;void handler(int signal)
{cout << getpid() << " " << signal << endl;sleep(1);
}int main()
{signal(8, handler);int n = 1;n /= 0;return 0;
}

在这里插入图片描述
在这里插入图片描述

野指针:

指针异常通常有两种: 无当前虚拟地址的映射关系 或 虚拟地址的操作和页表中的权限不匹配;
当 CPU 的 MMU 寄存器转换地址异常时后, CPU 会将异常的虚拟地址保存至 CR2 寄存器中, 状态设置为异常状态; 之后通知操作系统, 由操作系统向进程发送 SIGSEGV 信号, 该信号默认动作为终止程序;
但若将 SIGSEGV 信号设置自定义动作或忽略, 未处理异常时, 该硬件的异常数据属于进程的上下文; 由于进程依旧运行, 并且 CR2 寄存器依旧为异常状态, 那么操作系统会轮询式的发送异常信号至进程, 直至异常被处理或终止.

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>using namespace std;void handler(int signal)
{cout << getpid() << " " << signal << endl;sleep(1);
}int main()
{signal(11, handler);char* ptr = nullptr;*ptr = 0;return 0;
}

在这里插入图片描述
在这里插入图片描述

三. 核心转储

core dump(核心转储), 当进程出现异常终止时, 操作系统会将该进程的相关数据保存至当前目录下的一个核心转储文件, 文件名通常为 core 或 core.pid;

核心转储文件的主要目的是为了调试程序, 并且可以直接从出错的地方开始调试, 也叫做事后调试;

当信号的处理动作为 Core 时, 操作系统不仅终止程序, 还会创建核心转储文件; 但由于核心转储文件可能会包含敏感信息, 或文件过大等原因, 此功能通常是关闭的.

例:

  • 核心转储的打开和关闭
    使用指令可以查看当前系统中的资源限制情况, 默认核心转储文件大小为 0;
ulimit -a 

在这里插入图片描述
使用指令可以自行设置核心转储文件大小, 单位为 blocks

ulimit -c /*file_size*/

将核心转储文件大小设为 0, 即可关闭核心转储功能

ulimit -c 0
  • 核心转储的使用
g++ file_name -g 		// 编译文件时使用选项生成可调试文件// 运行程序, 生成核心转储文件
gdb file_name  			// 进入调试模式
core-file corefile_name // 使用核心转储文件, 直接定位至出错的地方
  • 父进程也可以通过等待查看子进程是否创建了核心转储文件; 若生成, core dump 标志设为 1, 若没有生成, core dump 标志为 0;
    在这里插入图片描述

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

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

相关文章

PNPM - nodejs 包管理

文章目录 一、关于 PNPM开发动机1、节省磁盘空间2、提升安装速度3、创建一个 non-flat node_modules 文件夹 二、安装通过 npm 安装 pnpm通过 Homebrew 安装 pnpm 三、pnpm CLI1、与 npm 的差异2、参数-C <path>, --dir <path>-w, --workspace-root 3、命令4、环境…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

Blender曲线操作

1.几种常见建模方式 -多边形建模&#xff1a;Blender&#xff0c;C4D&#xff0c;3DsMax&#xff0c;MaYa -曲线&#xff1a; -曲面&#xff1a;Rhino&#xff08;Nurbs&#xff09; -雕刻&#xff1a;Blender&#xff0c;ZBrush -蜡笔&#xff1a;Blender 1&#xff09;新…

windows11家庭版开启Hyper-v

前提&#xff1a;如果在控制面板中-->程序和功能-->启用和关闭windows功能-->没有Hyper-v 1.什么是Hyper-v&#xff1f; Hyper-v分为两个部分&#xff1a;底层的虚拟机平台、上层的虚拟机管理软件 2.Hyper-v安装 2.1新建hyper.cmd文件&#xff0c;写入下面的内容&…

物联网:从电信物联开发平台AIoT获取物联设备上报数据示例

设备接入到电信AIoT物联平台后&#xff0c;可以在平台上查询到设备上报的数据。 下面就以接入的NBIOT物联远传水表为例。 在产品中选择指定设备&#xff0c;在数据查看中可以看到此设备上报的数据。 示例中这组数据是base64位加密的&#xff0c;获取后还需要转换解密。 而我…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 操作系统有4个安全目标…

Unity Meta Quest MR 开发(七):使用 Stencil Test 模板测试制作可以在虚拟与现实之间穿梭的 MR 传送门

文章目录 &#x1f4d5;教程说明&#x1f4d5;Stencil Test 模板测试&#x1f4d5;Stencil Shader&#x1f4d5;使用 Unity URP 渲染管线设置模板测试⭐Render Pipeline Asset 与 Universal Renderer Data⭐删除场景中的天空盒⭐设置虚拟世界的层级 Layer⭐设置模板测试 &#…

大数据运维之数据质量管理

第1章 数据质量管理概述 1.1 数据质量管理定义 数据质量管理&#xff08;Data Quality Management&#xff09;&#xff0c;是指对数据从计划、获取、存储、共享、维护、应用、消亡生命周期的每个阶段里可能引发的各类数据质量问题&#xff0c;进行识别、度量、监控、预警等一…

使用工具速记

文章目录 一、sqlyoy登录账号信息迁移二、idea导入之前的已配置的idea信息三、设置windows UI大小四、其他 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、sqlyoy登录账号信息迁移 工具(sqlyog上面菜单栏)->导入导出详情->选择要导出的账号…

Graph Neural Networks(GNN)学习笔记

本学习笔记的组织结构是&#xff0c;先跟李沐老师学一下&#xff0c;再去kaggle上寻摸一下有没有类似的练习&#xff0c;浅做一下&#xff0c;作为一个了解。 ———————————0428更新—————————————— 课程和博客看到后面准备主要看两个&#xff1a;GCN和…

jvm知识点总结(二)

Java8默认使用的垃圾收集器是什么? Java8版本的Hotspot JVM,默认情况下使用的是并行垃圾收集器&#xff08;Parallel GC&#xff09; 如果CPU使用率飙升&#xff0c;如何排查? 1.先通过top定位到消耗最高的进程id 2.执行top -h pid单独监控该进程 3.在2中输入H&#xff…

Gin的中间件执行流程与用法

一、背景 我们在使用Gin框架进行Web开发的时候&#xff0c;基本上都会遇到登录拦截的场景。 例如某些接口必须在登录以后才能访问&#xff0c;根据登录用户的信息以及权限&#xff0c;拿到属于自己的数据, 反之&#xff0c;没登录过则直接拒绝访问。 那么我们怎么做到这些登录…

Unreal Engine添加UGameInstanceSubsystem子类

点击C类文件夹&#xff0c;在右边的区域点击鼠标右键&#xff0c;在弹出的菜单中选择“新建C类”在弹出的菜单中选中“显示所有类”&#xff0c;选择GameInstanceSubsystem作为父类, 点击“下一步”按钮输入子类名称“UVRVIUOnlineGameSubsystem”&#xff0c;选择插件作为新类…

9种单片机常用的软件架构

长文预警&#xff0c;加代码5000多字&#xff0c;写了4个多小时&#xff0c;盘软件架构&#xff0c;这篇文章就够了! 可能很多工程师&#xff0c;工作了很多年&#xff0c;都不会有软件架构的概念。 因为我在做研发工程师的第6年&#xff0c;才开始意识到这个东西&#xff0c;在…

IDEA主题美化【保姆级】

前言 一款好的 IDEA 主题虽然不能提高我们的开发效率&#xff0c;但一个舒适简单的主题可以使开发人员更舒适的开发&#xff0c;时常换一换主题可以带来不一样的体验&#xff0c;程序员的快乐就这么简单。话不多说&#xff0c;先上我自己认为好看的主题设置。 最终效果图: 原…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结&#xff0c;感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

使用逆滤波算法deconvwnr恢复图像回复图像时,产生了很多横竖条纹。解决办法

使用逆滤波算法deconvwnr恢复图像回复图像时&#xff0c;产生了很多横竖条纹。解决办法 原来的代码 % 清除工作空间并关闭所有图形窗口 clear; clc; close all;% 读取原始图像 original_image imread(pic3.jpg);% 显示原始图像 subplot(131); imshow(original_image); title…

区块链技术:NFG元宇宙电商模式

大家好&#xff0c;我是微三云周丽 随着互联网技术的迅猛发展&#xff0c;电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中&#xff0c;元宇宙电商以其独特的商业模式和巨大的发展潜力&#xff0c;成为行业的新宠。其中&#xff0c;NFG作为元宇宙电商模式的代表&am…

【无监督+自然语言】 GPT,BERT, GPT-2,GPT-3 生成式预训练模型方法概述 (Generative Pre-Traning)

主要参考 【GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【李沐论文精读】-2022.03.04】 https://www.bilibili.com/video/BV1AF411b7xQ/ 大语言模型综述&#xff1a; https://blog.csdn.net/imwaters/article/details/137019747 GPT与chatgpt的关系 图源&#xff1a;L…