当前位置: 首页 > news >正文

开心档之C++ 信号处理

C++ 信号处理

目录

C++ 信号处理

signal() 函数

实例

raise() 函数

实例



 

信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。

有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C++ 头文件 <csignal> 中。

信号描述
SIGABRT程序的异常终止,如调用 abort
SIGFPE错误的算术运算,比如除以零或导致溢出的操作。
SIGILL检测非法指令。
SIGINT程序终止(interrupt)信号。
SIGSEGV非法访问内存。
SIGTERM发送到程序的终止请求。

signal() 函数

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:


void (*signal (int sig, void (*func)(int)))(int); 

这个看起来有点费劲,以下语法格式更容易理解:

signal(registered signal, signal handler)

这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

让我们编写一个简单的 C++ 程序,使用 signal() 函数捕获 SIGINT 信号。不管您想在程序中捕获什么信号,您都必须使用 signal 函数来注册信号,并将其与信号处理程序相关联。看看下面的实例:

实例

#include <iostream>
#include <csignal>
#include <unistd.h>using namespace std;void signalHandler( int signum )
{cout << "Interrupt signal (" << signum << ") received.\n";// 清理并关闭// 终止程序  exit(signum);  }int main ()
{// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler);  while(1){cout << "Going to sleep...." << endl;sleep(1);}return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:


Going to sleep....
Going to sleep....
Going to sleep....

现在,按 Ctrl+C 来中断程序,您会看到程序捕获信号,程序打印如下内容并退出:


Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

raise() 函数

您可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,语法如下:


int raise (signal sig);

在这里,sig 是要发送的信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是我们使用 raise() 函数内部生成信号的实例:

实例

#include <iostream>
#include <csignal>
#include <unistd.h>using namespace std;void signalHandler( int signum )
{cout << "Interrupt signal (" << signum << ") received.\n";// 清理并关闭// 终止程序 exit(signum);  }int main ()
{int i = 0;// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler);  while(++i){cout << "Going to sleep...." << endl;if( i == 3 ){raise( SIGINT);}sleep(1);}return 0;
}

当上面的代码被编译和执行时,它会产生下列结果,并会自动退出:


Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

相关文章:

开心档之C++ 信号处理

C 信号处理 目录 C 信号处理 signal() 函数 实例 raise() 函数 实例 信号是由操作系统传给进程的中断&#xff0c;会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上&#xff0c;可以通过按 CtrlC 产生中断。 有些信号不能被程序捕获&#xff0c;但是下表…...

ChatGPT惨遭围剿?多国封杀、近万人联名抵制……

最近&#xff0c;全世界燃起一股围剿ChatGPT的势头。由马斯克、图灵奖得主Bengio等千人联名的“暂停高级AI研发”的公开信&#xff0c;目前签名数量已上升至9000多人。除了业内大佬&#xff0c;欧盟各国和白宫也纷纷出手。 最早“动手”的是意大利&#xff0c;直接在全国上下封…...

SpringBoot监听器

1.寻找spring.factories配置文件对应的监听器&#xff0c;主要要写监听器的全路径名&#xff0c;不然反射会报错 SpringBoot底层是如何读取META-INF/spring.factories的配置的&#xff1f; 1.遍历所有jar下的META-INF/spring.factories配置文件 2.读取配置文件下的所有属性&a…...

【网络安全】SQL注入--报错注入

报错注入报错注入定义代码展示常用的报错语句1.获取数据库名称2.获取mysql账号密码3.获取表名4.获取字段名5.获取账号密码报错注入定义 报错注入&#xff1a;利用sql语句的不规范&#xff0c;获取相关sql提示信息 代码展示 常用的报错语句 select first_name, last_name FROM…...

APP隐私整改建议

1、违规收集个人信息 情形一&#xff1a; APP首次启动时&#xff0c;未有以弹窗形式明示个人信息保护政策。 改进建议&#xff1a; APP首次启动时&#xff0c;以弹窗等形式向用户明示个人信息保护政策。 情形二&#xff1a; 个人信息保护政策未有说明个人信息处理的目的、方…...

MySQL数据模型 and 通用语法 and 分类

关系型数据库 关系型数据库是由多张能互相连接的二维表组成的数据库。 优点&#xff1a; 1.都是使用表结构&#xff0c;格式一致&#xff0c;易于维护。 2.使用通用的SQL语言操作&#xff0c;使用方便&#xff0c;可用于复杂查询。 3.数据存储在磁盘中&#xff0c;安全。 …...

一款识别域名是否使用cdn的工具cdnChecker

cdnChecker 一款识别域名是否使用cdn的工具 https://github.com/alwaystest18/cdnChecker 背景 红队打点时经常会有收集子域名然后转成ip进而扩展ip段进行脆弱点寻找的需求&#xff0c;如果域名使用cdn&#xff0c;会导致收集错误的ip段&#xff0c;因此我们需要排除cdn来收…...

Ant Design Vue的汉化

Ant Design Vue的汉化 1. 引入依赖 import zhCN from "ant-design-vue/lib/locale-provider/zh_CN"; // 汉化 export default {data () {zhCN,} }2. 标签包裹需要汉化的组件 <a-config-provider :locale"zhCN"><a-table :row-selection"ro…...

spring cloud中实现接口广播请求到服务提供者

一、背景 假如现在有一台服务A&#xff0c;两台服务B&#xff0c;可以简化为如下图模型&#xff1a; 需求&#xff1a;一次请求服务A需要同时将请求广播打到两台服务B上。 二、实现方案 2.1 需要应用到两个类&#xff1a; 2.1.1&#xff1a;LoadBalancerClient package org…...

电机PID参数调节笔记

规则1 1&#xff09;降低比例增益P&#xff0c;可以获得较小的振动2&#xff09;有可能不需要调节I环和D环3&#xff09;提升比例增益P环可以增加灵敏度&#xff0c;但可能会出现不稳定的情况&#xff08;如振动&#xff09;4&#xff09;可以设定电机速度最大幅值&#xff0c…...

【深度学习】基于华为MindSpore的手写体图像识别实验

1 实验介绍 1.1 简介 Mnist手写体图像识别实验是深度学习入门经典实验。Mnist数据集包含60,000个用于训练的示例和10,000个用于测试的示例。这些数字已经过尺寸标准化并位于图像中心&#xff0c;图像是固定大小(28x28像素)&#xff0c;其值为0到255。为简单起见&#xff0c;每…...

Linux:内核调试之内核魔术键sysrq

在linux系统下&#xff0c;我们可能会遇到系统某个命令hang住的情况&#xff0c;通常情况下&#xff0c;我们会查看/proc/pid/wchan文件&#xff0c;看看进程处于什么状况&#xff0c;然后进一步查看系统日志或者使用strace跟踪命令执行时的系统调用等等方法来分析问题。我们知…...

Python import导包快速入门

import 和 from import 在 Python 中&#xff0c;使用 import 语句可以将其他 Python 模块或包中的代码引入到当前模块中&#xff0c;以供使用。通常情况下&#xff0c;我们可以使用以下语法将整个模块导入到当前命名空间中&#xff1a; import module_name其中&#xff0c;m…...

ChatGPT这么火,我们能怎么办?

今天打开百度&#xff0c;看到这样一条热搜高居榜二&#xff1a;B站UP主发起停更潮&#xff0c;然后点进去了解一看&#xff0c;大体是因为最近AI创作太火&#xff0c;对高质量原创形成了巨大冲击&#xff01;记得之前看过一位UP主的分享&#xff0c;说B站UP主的年收入大体约等…...

HashMap底层原理

文章目录1. 基本概念2. HashMap 的底层数据结构3. HashMap 的 put 方法流程4. 怎么计算节点存储的下标5. Hash 冲突1&#xff09;概念2&#xff09;解决 hash 冲突的办法开放地址法再哈希法链地址法建立公共溢出区6. HashMap 的扩容机制1&#xff09;扩容时涉及到的几个属性2&a…...

卡顿优化小结

卡顿的本质 卡顿的本质是因为一次垂直同步信号来的时候&#xff0c;当前帧要显示的图像数据还没准备好&#xff0c;只能等待16ms下一次垂直同步信号来时才能更新画面&#xff0c;在这段时间里显示器只能一直停留在上一帧的画面&#xff0c;如果跳过的帧数过多&#xff0c;就会…...

springboot前端ajax 04 关于后台传的时间和状态在前端的转换

修改状态及时间格式 在jsp中&#xff0c;时间显式&#xff1a; 只需要把json的时间部分改为用Date对象来显示就好了。 <td>new Date(jsonObj[i].startTime).toLocaleString()</td> <td>new Date(jsonObj[i].endTime).toLocaleString()</td> 状态对象…...

解决Windows微信和 PowerToys 的键盘管理器冲突

Windows开机之后PowerToys能正常使用, 但是打开微信之后设置好的快捷键映射就全部失效了 打开微信 -> 左下角三条杠 -> 设置 -> 快捷键 首先我把微信的快捷键全部清空了,发现还是没用 然后发现了设置里默认勾选了检测快捷键,我在想程序肯定是一直在后台检测,而powerTo…...

组会时间的工作

1. 党支部活动 看看组织生活记录本写完了没有 2. 论文翻译...

linux udp bind 返回值-1分析

在linux socket通信中,我们通常用到open/bind/read/write等内部函数,那么当这些函数返回值为-1的时候,我们怎么进一步定位呢! (1)怎么打印出返回值出错的原因呢!系统调用的错误都会存放在errno中 errno需要的头文件: #include<errno.h> strerror头文件,将错误信…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...