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

C++ 信号处理怎么实现?

信号是由操作系统发送给进程的中断,可以使程序提前终止。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,你可以通过按 Ctrl+C 来生成中断。

有些信号无法被程序捕获,但以下是一些可以在程序中捕获并根据信号采取相应行动的信号列表。这些信号在 C++ 头文件 中定义。

序号信号 & 描述
1

SIGABRT

程序异常终止,例如调用abort

2

SIGFPE

错误的算术运算,例如除以零或导致溢出的运算。

3

SIGILL

检测到非法指令。

4

SIGINT

接收到交互式注意信号。

5

SIGSEGV

对存储器的无效访问。

6

SIGTERM

发送给程序的终止请求。

signal() 函数

C++ 信号处理库提供了signal函数来捕获意外事件。signal() 函数的语法如下 −

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

简单来说,此函数接收两个参数:第一个参数是一个整数,表示信号编号;第二个参数是指向信号处理函数的指针。

让我们编写一个简单的 C++ 程序,使用 signal() 函数捕获 SIGINT 信号。无论你想在程序中捕获什么信号,都必须使用signal函数注册该信号并将其与信号处理程序关联。查看以下示例 −

#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "中断信号 (" << signum << ") 已接收。\n"; // 在此处进行清理和关闭操作 // 终止程序 exit(signum); } int main () { // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(1) { cout << "准备休眠...." << 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> using namespace std; void signalHandler( int signum ) { cout << "中断信号 (" << signum << ") 已接收。\n"; // 在此处进行清理和关闭操作 // 终止程序 exit(signum); } int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(++i) { cout << "准备休眠...." << endl; if( i == 3 ) { raise( SIGINT); } sleep(1); } return 0; }

上述代码编译并执行后,会产生以下结果并自动退出 −

Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
http://www.jsqmd.com/news/663960/

相关文章:

  • 20、未来展望:AI编程范式、AGI挑战与职业发展路径
  • SQL高效实现两表数据对比_利用FULL OUTER JOIN查找差异
  • 【限时解密】SITS2026未公开AI编码评估矩阵(含CPU/内存/可维护性三维评分卡)
  • 用于分类基于因果性和局部相关性的网络
  • 【2026最严移动端合规红线】:SITS2026项目如何用AI生成通过GDPR/等保2.0/信创适配的代码?
  • 范围管理化技术需求跟踪矩阵与变更控制流程
  • 【限时开放】SITS2026内部生成模型微调手册泄露版:3类业务场景Prompt工程模板+12个生产环境Guardrail规则(仅剩87份)
  • SITS2026闭门研讨纪要首度流出:LLM+AST+SBOM三模态依赖分析框架(含GitHub私有仓库适配补丁)
  • Spec研发平台实践,从Vibe Coding到范式编程,打造AI领域专家
  • C++零基础到工程实战(4.3.3):vector数组访问与遍历
  • 【AGI真相警告】:为什么所有千亿参数模型仍只是“高级鹦鹉”?3层认知架构缺失正在扼杀真正智能
  • AI 热点资讯日报20260418
  • 从Prompt Engineering到AST级重写:2026奇点大会独家披露——主流AI代码引擎的底层编译流程差异,为什么Copilot Pro在微服务重构中失败率高达41.6%?
  • 冲刺规划管理化技术中的冲刺规划计划冲刺规划实施冲刺规划验证
  • LayerDivider:如何实现单张插画智能分层的终极解决方案
  • Hermes Agent 架构深度解析,三层骨架六系统,解锁AI智能体的工程化落地密码
  • 【AGI突破路线图】:20年AI架构师亲授3大技术瓶颈的破解路径与2025关键窗口期
  • ‌学工软件厂家怎么选?这几个关键点别忽视
  • 为什么你的AI生成代码上线3天就报错?7类隐性依赖漏洞,87%开发者从未检测过!
  • 数据分析避坑指南:皮尔逊相关系数=0,真的代表两个变量没关系吗?
  • CSS Grid布局如何实现响应式排列_通过grid-template-columns适配不同屏幕
  • Milliohm毫欧电子高精度合金电阻与电流采样解决方案
  • ORA-01877: string too long 报错修复与远程处理技巧
  • Go语言的context.WithCancel系统协调
  • ‌如何为智慧校园系统选型?用好多维数据才能真正优化管理流程
  • 从实验室到手术室,AGI医疗转化率暴跌87%的5个致命盲区及反脆弱架构设计
  • ROHM罗姆推出支持10Gbps以上高速I/F的ESD保护二极管的特点和应用方案
  • 编码与调制核心技术解析
  • Java GC 调优:从理论到实战
  • 用100道题拿下你的算法面试(矩阵篇-2):求转置矩阵