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

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

👻 概念

  • 信号 —— 操作系统传给进程的中断,会提早终止程序
  • 有些信号不能被程序捕获,有些则可以被捕获,并基于信号采取适当的动作
信号描述
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.lryc.cn/news/542746.html

相关文章:

  • 最新前端框架选型对比与建议(React/Vue/Svelte/Angular)
  • 游戏引擎学习第123天
  • 计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码
  • grafana K6压测
  • Vue的组合式API和选项式API有什么区别
  • ubuntu 安全策略(等保)
  • c/c++蓝桥杯经典编程题100道(22)最短路径问题
  • AI工具集合
  • CSDN 博客:CC++ 内存管理详解
  • 表单制作代码,登录动画背景前端模板
  • 嵌入式项目:STM32刷卡指纹智能门禁系统
  • LeetCode 热题100 141. 环形链表
  • 以绘图(绘制点、直线、圆、椭圆、多段线)为例子 通过设计模式中的命令模式实现
  • 鹏哥c语言数组(初阶数组)
  • 利用go-migrate实现MySQL和ClickHouse的数据库迁移
  • 计算机毕业设计SpringBoot+Vue.js企业客户管理系统(源码+LW文档+PPT+讲解+开题报告)
  • jmeter 如何做移动端的测试 特别是兼容性测试
  • 深度学习技术全景图:从基础架构到工业落地的超级进化指南
  • vllm部署LLM(qwen2.5,llama,deepseek)
  • 基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 如何防止 Docker 注入了恶意脚本
  • 使用python接入腾讯云DeepSeek
  • 【MySQL】服务正在启动或停止中,请稍候片刻后再试一次【解决方案】
  • 测试工程师玩转DeepSeek之Prompt
  • 【PyTorch】2024保姆级安装教程-Python-(CPU+GPU详细完整版)-
  • 精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化
  • MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析
  • Linux运维——网络管理
  • STM32CUBEIDE FreeRTOS操作教程(十三):task api 任务访问函数
  • Jmeter+Jenkins接口压力测试持续集成