C++学习,信号处理

embedded/2024/12/21 20:45:11/

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.ppmy.cn/embedded/121772.html

相关文章

IDEA 高版本创建 Spring Boot 项目选不到 java 8

一、场景分析 现在高版本的 IDEA&#xff0c;创建 Spring Boot 项目时常常会选不到 Java 8&#xff1a; 直接使用 Java 17 新建项目&#xff0c;又会报错&#xff1a; Selected version of Java 17 is not supported by the project SDK 1.8. Either choose a lower version o…

[dp]最优除法

问题描述 请你通过若干次除法将一个数字 x x x 变得不超过 y y y。 现在有很多个除数可以选择&#xff0c;给定一个长度为 n n n 的序列 b b b。表示除数 i i i 的花费是 b i b_i bi​&#xff0c; 你可以用这个除数把 x x x 变为 x / i x / i x/i。每种除数可以使用…

Oracle中MONTHS_BETWEEN()函数详解

文章目录 前言一、MONTHS_BETWEEN()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中&#xff0c;MONTHS_BETWEEN()函数可以用来计算两个日期之间的月份差。它返回一个浮点数&#xff0c;表示两个日期之间的整月数。 一、MONTHS_BETWEEN()的语法 MONTHS_BETWEEN(dat…

《RabbitMQ篇》基本概念介绍

MQ功能 解耦 MQ允许不同系统或组件之间松散耦合。发送者和接收者不需要直接连接&#xff0c;从而提高了系统的灵活性和可维护性。异步处理 使用MQ可以实现异步消息传递&#xff0c;发送者可以将消息放入队列后立即返回&#xff0c;不必等待接收者处理。这提高了系统的响应速度…

Qt 概述

1. Qlabel HelloWorld 程序 使用纯代码实现 // widget.cpp Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 给当前这个lable对象&#xff0c;指定一个父对象QLabel* label new QLabel(this);// C语言风格的字符串可以直接…

[数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别

重要说明&#xff1a;数据集图片里面都是一个辣椒&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求下载 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

双指针,平衡二叉树与最小生成树

1&#xff1a;直方图的水量 题目链接&#xff1a;面试题 17.21. 直方图的水量 - 力扣&#xff08;LeetCode&#xff09; 双指针 初始化&#xff1a;我们使用两个指针 left 和 right 分别指向数组的开始和结束。同时&#xff0c;我们记录下这两个位置的高度&#xff0c;即 max…