【Linux】信号的产生

news2025/1/17 23:22:41

目录

    • 一. 信号的概念
      • 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.coloradmin.cn/o/1622811.html

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

相关文章

麒麟 Kylin V10 一键安装 Oracle 11GR2 单机 ASM(231017)

前言 Oracle 一键安装脚本&#xff0c;演示麒麟 Kylin V10 一键安装 Oracle 11GR2 单机 ASM&#xff08;231017&#xff09;过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&a…

mp4转mpg怎么转?3个好用软件推荐~

mpg文件格式&#xff0c;即MPEG&#xff08;Moving Picture Experts Group&#xff09;格式&#xff0c;起源于1993年&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;制定。当时视频传输的需求催生了这一高效的视频压缩标准&#xff0c;其设计目的在于在保持相对较好…

数据科学与大数据(学习记录)

这个专业或者方向&#xff0c;这个行业有一句话叫做工具决定下限&#xff0c;分析决定上限。通过数据解决问题的思路是最重要的&#xff0c;对于这类型人才.数据具有四大特性&#xff0c;一个是可以反复使用&#xff0c;一个是客观,量化,机器可处理.常见的分析流程&#xff0c;…

广州大学计算机网络实验报告五《网络程序设计》2023年

广州大学学生实验报告 开课学院及实验室&#xff1a; 学院 年级、专业、班 姓名 学号 实验课程名称 计算机网络实验 成绩 实验项目名称 网络程序设计 指导老师 &#xff08;1&#xff09;实验目的 通过程序模拟网桥的工作原理以及检验和的计算&am…

C++ 协程 学习笔记

协程的优势就是比线程切换的时间少很多&#xff0c;协程的切换时间是纳秒&#xff0c;而进行切换的时间是微秒 单线程用协程可以轻松的处理并发任务 co_yield和co_await可以将协程暂停下来 resume又把协程激活 如果c函数里有co_await、co_return、co_yield就会自动判定为协程…

可搜索加密:保护隐私的搜索技术

在信息化、数字化快速发展的今天&#xff0c;数据的安全性和隐私性已成为公众关注的焦点。随着云计算、大数据等技术的广泛应用&#xff0c;数据共享与协同工作日益普遍&#xff0c;但如何在确保数据安全性的前提下&#xff0c;实现数据的快速、高效检索&#xff0c;成为了一个…

一个Level 0富文本编辑器的进化历程

本文作者为 360 奇舞团前端开发工程师 一个Level 0富文本编辑器的进化历程 富文本编辑器是我们在生活中常用到的编辑工具&#xff0c;本文将为大家介绍富文本编辑器技术成长的历程&#xff0c;在最后会带大家利用document.execCommand实现一个简单的传统编辑器。 ps&#xff1a…

EasyCVR视频汇聚平台无法自动播放视频的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…

contenteditable可编辑功能,监听输入内容与回车操作

contenteditable 在div元素上添加contenteditable"true" 可以让div变成可编辑元素 <div class"word-block" contenteditable"true"></div>同时还支持回车换行 回车后就会生成一个div元素 添加 -webkit-user-modify: read-write-p…

spring DisposableBean作用,在spring Bean销毁时的钩子 以及@PreDestroy

DisposableBean 作用 在Spring框架中&#xff0c;DisposableBean是一个接口&#xff0c;它定义了一个单一的方法&#xff0c;用于在Spring容器关闭时或一个由Spring管理的Bean不再需要时执行特定的清理操作。当一个Bean实现了DisposableBean接口&#xff0c;Spring容器会在销毁…

VTC视频时序控制器原理以及Verilog实现

文章目录 一、前言二、视频时序控制原理三、Verilog实现3.1 代码3.2 仿真以及分析 一、前言 VTC&#xff08;Video Timing Controller&#xff09;是一种用于产生视频时序的控制器&#xff0c;在图像领域经常会输出各种分辨率和帧率的视频格式。因此为了方便&#xff0c;设置一…

C++: IO流

目录 1、C语言输入输出 流的概念&#xff1a; 2、CIO流 3、C文件IO流 1、C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf () 与 printf() 。 scanf(): 从标准输入设备 ( 键 盘 ) 读取数据&#xff0c;并将值存放在变量中 。 printf(): 将指定的文…

C语言入门课程学习笔记2

C语言入门课程学习笔记2 第8课 - 四则运算与关系运算第9课 - 逻辑运算与位运算第10课 - 深度剖析位运算第11课 - 程序中的选择结构 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第8课 - 四则运算与关系…

pycharm安装AI写代码插件

在IDE安装特慢&#xff08;可能找不到插件&#xff09; 去官网搜一下 对应安装包 下载zip在IDE解压 插件--已安装齿轮图标--从磁盘里安装 选择下载的插件 应用 --重启OK

在ubuntu上安装mysql(在线安装需要)

安装环境 虚拟机系统&#xff1a; Ubuntu 打开虚拟机 安装步骤 (1) 安装 将系统中的所有软件包都升为最新版本 sudo apt update 安装 MySQL sudo apt install mysql-server查询 MySQL 版本 mysql --version(2) MySQL 安全设置 进入 MySQL Shell sudo mysql设置 …

window平台C#实现软件升级功能(控制台)

window平台C#实现软件升级功能 之前用window窗体实现过一个升级功能&#xff0c;后来发现多个项目都需要升级功能&#xff0c;现改成可接收参数实现一种通用的exe.改用控制台方式实现这个升级功能&#xff0c;这样不仅实现了接收参数&#xff0c;升级程序体积也比原来的窗体形式…

java自动生成pojo,springboot自动生成pojo

第一步 pom引入依赖 <dependencies><!-- mybatis-generator --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</version></dependency>&…

开源电商小程序源码+搭建 支持全平台端口+商家自营+多商户入驻 带分销功能 可自用DIY界面

开源电商小程序源码系统为商家提供了一个快速搭建和部署电商平台的解决方案。商家可以利用该系统&#xff0c;在较短的时间内构建出功能齐全、界面美观的电商小程序&#xff0c;无需从零开始编写代码&#xff0c;从而大大节省了开发成本和时间。 分享一个开源电商小程序源码系…

OpenUI在windows下部署使用

OpenUI OpenUI是一个基于Python的AI对话平台&#xff0c;支持接入多种AI模型。 通过聊天的方式来进行UI设计&#xff0c;你可以通过文字来描述你想要的UI界面&#xff0c;OpenUI可以帮你实时进行渲染出效果 安装OpenUI 这里预设你的电脑上已安装git、Python和pip&#xff0…

Nginx 搭建Web服务

题目&#xff1a; 1.web服务器的主机ip&#xff1a;192.168.78.128 2.web服务器的默认访问目录为/var/www/html 默认发布内容为default‘s page 3.站点news.timinglee.org默认发布目录 为/var/www/virtual/timinglee.org/news 默认发布内容为 news.timinglee.org 4.站点login.t…