首页 > 编程语言 >C++学习,信号处理

C++学习,信号处理

时间:2024-09-26 15:50:49浏览次数:11  
标签:函数 int 程序 信号处理 SIGINT C++ 学习 信号 signal

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

 

标签:函数,int,程序,信号处理,SIGINT,C++,学习,信号,signal
From: https://blog.csdn.net/xuann/article/details/142535619

相关文章

  • C++学习,# 和 ## 运算符
    C++中,# 和 ## 是两个特殊的预处理运算符,它们主要在宏定义中使用,用于字符串化和标记粘贴(tokenpasting)操作。 # 运算符:字符串化# 运算符用于将其后的宏参数转换为一个字符串常量。如果宏参数是一个宏标识符,则它会被转换成用双引号括起来的该标识符的字符串表示。这个操......
  • Effective C++学习
    导读声明式externintx;std::size_tnumDigits(intnum);classPerson;template<typenameT>classGraphNode;签名式std::size_t(int);//这个函数获得一个int,返回一个size_t定义式intx;std::size_tnumDigits(intnum){std::size_tdigitSoFar=......
  • 吴恩达-深度学习-课后作业-答案与总结
    deeplearning-assignment吴恩达-深度学习-课后作业-答案与总结作业只上传了ipynb文件,ipynb文件会持续更新,其它附件如预训练模型等由于太多太大,存放于网盘中执行ipynb文件所需附件下载地址,链接:百度网盘-链接不存在 密码:66gd吴恩达深度学习视频地址:进入 http://study.163......
  • 【前端学习】 NestJS 之 控制器 (Controller)
    文章目录控制器(Controller)*路由(router)请求对象(requestobject)*资源(Resources)状态码(statuscode)标头&重定向(headers&redirection)*路由参数(routeparameters)*请求负载(requestpayloads)启动并运行小结控制器(Controller)控制器负责处理......
  • MarkDown学习
    MarkDown学习标题三级四级字体helloword!粗体在两边加上两个*号helloword!斜体在两边加上一个*号helloword!斜体加粗在两边加上三个*号helloword! 在两边加上两个~~号引用选择大于努里>分割线三个—三个*图片本地图片路径网络图片地......
  • go语言学习入门
    packagemain是什么packagemain是Go语言程序的包声明,表示该文件属于主包。主包是Go程序的入口点,包含一个名为main的函数。这个函数是程序启动时首先执行的代码。每个可执行的Go程序都需要有一个main包和main函数。packagemainimport"fmt"funcmain(){fmt.P......
  • Arthas学习笔记
    一、运行环境操作系统:centos7.9Java版本:jdk1.8.201arthas版本:3.6.9二、安装Arthas并attach一个进程curl-Ohttps://alibaba.github.io/arthas/arthas-boot.jarcurl-Ohttps://alibaba.github.io/arthas/arthas-demo.jarjava-jararthas-demo.jar#先启动Javademo进程......
  • 数据挖掘与机器学习(DM&ML)(PART3)
    三.DATA(Whatisdata?)1.1数据集的类型:记录型:数据矩阵:以矩阵形式呈现的数据集合,通常行代表对象(记录、实例等),列代表属性。例如,一个包含学生信息的数据集,行可以是不同的学生,列可以是学生的姓名、年龄、成绩等属性。文档数据:由文档组成的数据集,每个文档可以是一篇文章、一......
  • Python学习
    Python学习1.执行python程序大多数程序语言,入门编程代码是"HelloWorld!",以下代码为使用Python输出(打印)"HelloWorld!"print("HelloWorld!")可以理解为想打印什么东西只需要把print("")写好,把想打印的内容放在""里即可2、打印多个HelloWorld!需求:打印1000......
  • prometheus学习笔记之服务发现kubernetes_sd_configs
    一、prometheus的服务发现机制prometheus默认是采用pull方式拉取监控数据的,也就是定时去目标主机上抓取metrics数据,每一个被抓取的目标需要暴露一个HTTP接口,prometheus通过这个暴露的接口就可以获取到相应的指标数据,这种方式需要由目标服务决定采集的目标有哪些,通过配......