【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.mzph.cn/web/4917.shtml

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

相关文章

智能优化算法及 MATLAB 实现(书籍推荐)

智能优化算法及 MATLAB 实现&#xff08;书籍推荐&#xff09; 介绍前言目录第1章 粒子群优化算法原理及其MATLAB实现第2章 哈里斯鹰优化算法原理及其MATLAB实现第3章 沙丘猫群优化算法原理及其MATLAB实现第4章 鲸鱼优化算法原理及其MATLAB实现第5章 大猩猩部队优化算法原理及其…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

Leetcode - 周赛395

目录 一&#xff0c;3131. 找出与数组相加的整数 I 二&#xff0c;3132. 找出与数组相加的整数 II 三&#xff0c;3133. 数组最后一个元素的最小值 四&#xff0c;3134. 找出唯一性数组的中位数 一&#xff0c;3131. 找出与数组相加的整数 I 本题本质就是求两个数组最小值的…

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中&#xff0c;一个组件是指一个独立的、可替换的软件单元&#xff0c;它封装了一组相关的功能。组件通过定义的接口与外界交互&#xff0c;并且这些接口隔离了组件内部的实现细节。在Swift语言中&#xff0c;组件可以是一个模块、一…

文献速递:肺癌早期诊断---低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查

Title 题目 End-to-end lung cancer screening with three-dimensional deep learning on low-dose chest computed tomography 低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查 01文献速递介绍 2018年估计有160,000例死亡病例&#xff0c;肺癌是美国最常见的癌症…

青少年软件编程(Scratch一级)等级考试试卷(2019年12月)

客观题 题目总数&#xff1a;35 总分数&#xff1a;70 时间&#xff1a;不限时 CSDN添加图片自带水印&#xff0c;可至文末获取无水印版word文档 第 1 题 单选题 下列关于舞台的描述&#xff0c;不正确的是&#xff1f;&#xff08; &#xff09; A.Scratch只能…

MVVM框架

LifeCycle 翻译为生命周期。意义就是为了监控某个事件的生命周期。 此处用了addObserver函数&#xff0c;代表添加监控者。监控该activity的变化。activity的状态有onCreate,onStop,onDestory等&#xff0c;该函数表示对所有状态进行监听。 该方法使用了标签的方法&#xff0c…

护航智慧交通安全 | 聚铭精彩亮相2024交通科技创新及信创产品推广交流会

4月26日&#xff0c;石家庄希尔顿酒店内&#xff0c;河北省智能交通协会盛大举办2024年度交通科技创新及信创产品推广交流会。聚铭网络受邀参与&#xff0c;携旗下安全产品及解决方案精彩亮相&#xff0c;为智慧交通安全保驾护航。 为深化高速公路创新驱动发展战略&#xff0…

2024 java easyexcel poi word模板填充数据,多个word合成一个word

先看效果 一、准备工作 1.word模版 2.文件路径 二、pom依赖 <!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency><depe…

如何申请免费SSL证书,把网站升级成HTTPS

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是一种用于安全数据传输的网络协议&#xff0c;它可以有效地保护网站和用户之间的通信安全。然而&#xff0c;要使一个网站从HTTP升级到HTTPS&#xff0c;就需要一个SSL证书。那么&#xff0c;如何申请免费的…

一文解读 SQL 生成工具

SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性&#xff0c;通过解析 YACC 语法文件中的产生式&#xff0c;生成对应的 SQL 语句&#xff0c;再使用数据库执行该 SQL&#xff0c;根据结果判断语句是否与其他数据库语法兼容。 01工具使用 语法文件预处理 预处理目的…

notion使用小tip(待补充)

可以替代思维导图是一个很棒的软件 公式编辑&#xff1a;latex 网站链接&#xff1a;LATEX语法 一些常用的用法&#xff1a; 下标&#xff1a;a_{Si} 分数&#xff1a;\frac{}{} 乘&#xff1a;\times 向量&#xff1a;\vec{} pai (3.14159…) : \pi 直接用公式编辑器&#…

【kettle005】kettle访问Oracle数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下Oracle数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&am…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

C语言阶段性测试错题纠正与拓展

引言&#xff1a;在2024年4月26日&#xff0c;我进行了C语言知识的“期末考试”。通过这次考试&#xff0c;我发现了我的知识漏洞。所以&#xff0c;我写下这篇博客来记录我的错题&#xff0c;并进行纠正&#xff0c;然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…

HarmonyOS编程实践系列:第一节 - 创建健康App欢迎页

系列文章目录 &#xff08;零&#xff09;鸿蒙HarmonyOS入门&#xff1a;如何配置环境&#xff0c;输出“Hello World“ &#xff08;一&#xff09;鸿蒙HarmonyOS开发基础 &#xff08;二&#xff09;鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 &#xff08;三&#xff09;鸿蒙…

梳理一下低代码的真正价值!另推荐超好用的5款低代码开发平台

一、先来聊聊低代码的真实价值&#xff01; 在回答这个问题之前&#xff0c;我们不妨先来看两个案例&#xff1a; 某连锁商超企业在发展中产生了新的业务需求&#xff0c;一是希望能够快速展示门店销售数据&#xff0c;满足高层的管理需求&#xff1b;二是希望巡店、上架商品…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

Jitter 和相位噪声

近期学习PLL的时候&#xff0c;发现里面有诸多jitter类型&#xff0c;绕晕了&#xff0c;写个帖子记录一下学习过程。 目录 基本jitter和相噪概念 jitter 相位噪声 相位噪声和jitter之间的联系 三种常见的抖动类型及其特点 基本jitter和相噪概念 无噪声振荡器的输出是一…

状态模式

文章目录 1.UML类图2.状态基类3.状态实现类3.状态机管理类使用示例 1.UML类图 2.状态基类 public abstract class State {public string? Name { get; set; }public StateMachine? StateMachine {get; set;}public abstract void Exit();public abstract void Enter(); }3.…