当前位置: 首页 > 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/a/327324.html

相关文章:

  • 【Telephony】Android移动数据网络的控制面和数据面含义
  • leetcode-44-通配符匹配
  • 计算机网络之会话层
  • 7.揭秘C语言输入输出内幕:printf与scanf的深度剖析
  • Unity3D 完整直升机控制器(虚拟仿真级别)
  • JS的学习与使用
  • 组播基础-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 用法