C++ | 高级教程 | 信号处理

news/2025/2/26 19:09:10

👻 概念

  • 信号 —— 操作系统传给进程的中断,会提早终止程序
  • 有些信号不能被程序捕获,有些则可以被捕获,并基于信号采取适当的动作
信号描述
SIGABRT程序的异常终止,如调用 abort
SIGFPE错误的算术运算,比如除以零或导致溢出的操作
SIGILL检测非法指令
SIGINT程序终止 (interrupt) 信号
SIGSEGV非法访问内存
SIGTERM发送到程序的终止请求

👻 准备工作

使用信号处理需要包含 <csignal> 头文件:

#include <csignal>

👻 捕获信号

👾语法格式

使用 signal() 函数 捕获信号

void signal(registered signal, signal handler)
  • 参数 signal —— 要设置信号的标识符

  • 参数 handler —— 指向信号处理函数的指针,函数返回值是指向先前信号处理函数的指针:

    • 先前没有设置信号处理函数,返回值为 SIG_DFL
    • 先前设置的信号处理函数为 SIG_IGN,则返回值为 SIG_IGN

👾示例代码

  • 使用 signal() 函数捕获 SIGINT 信号,并将其与信号处理程序 signalHandler() 相关联。
void signalHandler(int signum) {
	cout << "Interrupt signal (" << signum << ") received.\n";
	exit(signum);	// 终止程序
}

...
	
// 注册信号 SIGINT 和信号处理程序
signal(SIGINT, signalHandler);
while(1) {
	cout << "Going to sleep...." << endl;
	sleep(1);
}
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.	// 按下 ctrl+c 键时退出程序

👻 生成信号

👾语法格式

使用 raise() 函数 生成信号

int raise (signal sig);
  • 参数 sig —— 要发送的整数信号编号,包括 SIGINTSIGABRTSIGFPESIGILLSIGSEGVSIGTERMSIGHUP

👾示例代码

  • 使用 raise() 函数生成 SIGINT 信号,并通过 signal() 函数捕获并处理。
void signalHandler( int signum ) {
	cout << "Interrupt signal (" << signum << ") received.\n";
	exit(signum);
}

...

signal(SIGINT, signalHandler);

int i = 0;
while(++i) {
	cout << "Going to sleep...." << endl;
	if(i==3)
		raise( SIGINT);	// 生成 SIGINT 信号
	sleep(1);
}

Sleep函数

  • 功能:执行挂起,等待一段时间后再继续执行

  • 用法

    void Sleep(DWORD dwMilliseconds);	// Windows系统,dwMilliseconds单位毫秒
    
    unsigned int sleep(unsigned int seconds);	// POSIX系统,seconds单位秒
    
  • 注意

    • POSIX系统(如LinuxmacOS)—— 使用 #include <unistd.h>sleep() ,单位秒

    • Windows系统 —— 使用 #include <windows.h>Sleep() ,单位毫秒


http://www.niftyadmin.cn/n/5869090.html

相关文章

文件上传漏洞学习笔记

一、漏洞概述 定义 文件上传漏洞指未对用户上传的文件进行充分安全校验&#xff0c;导致攻击者可上传恶意文件&#xff08;如Webshell、木马&#xff09;&#xff0c;进而控制服务器或执行任意代码。 危害等级 ⚠️ 高危漏洞&#xff08;通常CVSS评分7.0&#xff09;&#xff…

PDF转HTML 超级好用 免费在线转换PDF 完美转换格式

PDF转HTML 超级好用 免费在线转换PDF 完美转换格式&#xff0c;PDF已成为一种广泛使用的文件格式&#xff0c;用于保存和分享文档。然而&#xff0c;PDF文件在某些场景下可能不够灵活&#xff0c;特别是在需要在网页上直接展示其内容时。为了满足这一需求&#xff0c;小白工具推…

自定义提交按钮触发avue-form绑定的submit事件

场景 使用avue-form时&#xff0c;提交按钮会绑定至form区域下方&#xff0c;如果想自定义按钮位置&#xff0c;需要通过dialog的footer位置进行编写&#xff0c;例如&#xff1a; <avue-form ref"form" v-model"dataInfo" :option"dataInfoOpti…

大语言模型的不足与研究热点

大语言模型的不足 技术局限性 理解与判断不足&#xff1a;缺乏人类的直觉和伦理判断&#xff0c;可能生成不准确或道德争议内容&#xff0c;例如在复杂伦理决策中表现不佳。 上下文依赖性&#xff1a;对输入上下文的完整性要求较高&#xff0c;若信息模糊或不完整&#xff0c…

汽车制造又一革新:Profinet-EtherCAT实现高精度激光焊接

通过稳联技术Profinet到EtherCAT网关&#xff0c;将PLC控制系统与激光焊接机器人连接&#xff0c;实现高精度的汽车车身焊接。 在现代汽车制造过程中&#xff0c;装配线的自动化程度直接影响生产效率和产品质量。某知名汽车制造厂引入了稳联技术Profinet转EtherCAT协议网关&…

Language Models are Unsupervised Multitask Learners,GPT-2详细讲解

1542M1.542B15.42亿个 1.背景和动机 1.GPT-1在特定自然语言理解任务标注较少情况下&#xff0c;通过利用大量无标注数据&#xff0c;取得较强性能 2.BERT性能超越GPT-1&#xff0c;GPT-2通过构建更大数据集和模型&#xff0c;同时在zero-shot的多任务学习场景中展示不错性能 …

React加TypeScript最新部署完整版

React TypeScript 全流程部署指南 一、环境准备与项目初始化 关于node.js及npm的安装请参见我的文章。 1.1 创建项目&#xff08;React TypeScript&#xff09; # 使用官方推荐脚手架&#xff08;Vite 5.x&#xff09; npx create-vitelatest my-app --template react-ts …

Java Web开发实战与项目——项目集成与部署

软件开发中&#xff0c;集成与部署是非常关键的一步。无论是将前端与后端模块进行有效的集成&#xff0c;还是通过自动化构建工具&#xff08;如Maven&#xff09;和CI/CD工具&#xff08;如Jenkins&#xff09;实现自动化部署&#xff0c;都会对项目的开发和发布流程产生深远影…