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

C++学习,信号处理

C++信号处理,依赖于操作系统提供的API。信号处理主要用于响应外部事件,如中断信号(如SIGINT, SIGTERM等),这些信号可以由操作系统、其他程序或用户生成。

在Unix-like系统(如Linux和macOS)中,信号处理可以通过signal函数或更灵活的sigaction函数来设置。在C++程序中直接使用这些函数是完全可行的,因为它们都是C标准库中的一部分,但C++标准库本身并不提供额外的封装或功能。

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

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

发送到程序的终止请求。

使用signal函数

signal函数用于设置信号的处理函数,其原型定义在<csignal>(或在C中为<signal.h>)头文件中,void (*signal (int sig, void (*func)(int)))(int);

示例:

#include <csignal> 
#include <iostream>    
void signalHandler(int signum) {  
    std::cout << "Caught signal " << signum << std::endl;    
    // 清理并关闭  
    // ...    
    // 退出程序  
    exit(signum);  
}  
  
int main () {  
    // 注册信号 SIGINT 和信号处理程序  
    signal(SIGINT, signalHandler);  
  
    // 主程序循环  
    while(true) {  
        std::cout << "Going to sleep...." << std::endl;  
        sleep(1);  
    }    
    return 0;  
}

使用raise函数

使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,函数原型:int raise (signal sig);

示例:

#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;
}

 


http://www.kler.cn/news/327324.html

相关文章:

  • 组播基础-1
  • 结构体内存对齐与位段
  • 基于 Qwen2.5-0.5B 微调训练 Ner 命名实体识别任务
  • Java数据结构链表(LinkedList详解)
  • Vue3 Typescript 前端页面5min后无操作自动退出至登录页面
  • Windows上面搭建Flutter Android运行环境
  • cmd下的管理员权限闪退 原理分析
  • 【Rockchip系列】官方函数:drm_buf_alloc
  • 【Kotlin基于selenium实现自动化测试】初识selenium以及搭建项目基本骨架(1)
  • 华为OD机试 - 超级玛丽通过吊桥的走法 - 动态规划(Python/JS/C/C++ 2024 E卷 200分)
  • 数据结构——计数、桶、基数排序
  • 深入探索 PyTorch 在机器学习中的应用
  • 观测云对接 SkyWalking 最佳实践
  • Springboot中yml文件不生效原因分析及解决
  • 【C++篇】启航——初识C++(下篇)
  • 滚雪球学Oracle[7.1讲]:Oracle云数据库
  • 如何从 Windows 11/10/8.1/8/7 中恢复已删除的视频
  • 前端导出页面PDF
  • rust的nutyp验证和validator验证数据的方法
  • MySQL | group by 用法
  • 牛客周赛 Round 62
  • 828华为云征文|部署个人文档管理系统 Docspell
  • Kali Linux安全工具
  • 实战OpenCV之形态学操作
  • 网络带宽对于服务器的影响
  • 云原生之运维监控实践-使用Prometheus与Grafana实现对MySQL和Redis服务的监测
  • Drf认证组件
  • Feign 主要负责简化 HTTP API 的调用逻辑; Eureka 负责服务实例的注册和服务发现; Ribbon 则负责实现客户端的负载均衡。
  • UE4_Niagara基础实例—7、如何让粒子照亮周边环境
  • 制造企业各部门如何参与生产成本控制与管理?