首页 > 编程语言 >C++温故补缺(十四):信号处理

C++温故补缺(十四):信号处理

时间:2023-03-20 23:23:18浏览次数:40  
标签:函数 signal C++ 参数 信号 补缺 include 温故 捕获

信号处理

信号是由操作系统传给进程的中断,能够提前终止一个程序。在Unix,Linux,Mac OS 或Windows系统上,都可以通过Ctrl+C产生中断。

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

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

signal函数

signal函数用来捕获突发事件,signal语法:

signal (registered signal,signal handler)

函数的第一个参数是一个整数,代表了信号的编号,第二个参数一个指向信号处理函数的指针,也就是要把一个函数传进去当参数。例子:

#include<iostream>
#include<csignal>
#include<unistd.h>

using namespace std;

void signalHandler(int signum){
    cout<<"Interrupt signal:"<<signum<<endl;
    exit(signum);
}
int main(){
    signal(SIGINT,signalHandler);
    int x;
    cout<<"Press Ctrl C"<<endl;
    cin>>x;
}

signal()的第一个参数是定义好的可以捕获的信号,如上SIGINT就是用来捕获交互注意信号的。可以在VS中查看定义:

该头文件给出了这几个信号的宏定义以及解释,可以看到它们是一些整数

signal()的第二个参数是捕获到信号后用来执行动作的函数,其参数就是前面该信号的整型值。

运行:

就捕获到了这个信号,并输出提示语句

ps:捕捉信号不能用run and debug,只能先编译,然后在终端运行

raise()函数

raise()函数用来主动生成信号,参数为一个整数

int raise(signal sig);

例子:

#include<iostream>
#include<csignal>
#include<unistd.h>

using namespace std;

void signalHandler(int signum){
    cout<<"Interrupt signal:"<<signum<<endl;
    exit(signum);
}
int main(){
    signal(SIGINT,signalHandler);
    int i=-1;
    if(i<0){
        raise(SIGINT);
    }

}

标签:函数,signal,C++,参数,信号,补缺,include,温故,捕获
From: https://www.cnblogs.com/Tenerome/p/cppreview14.html

相关文章

  • C++温故补缺(十三):模板
    C++模板模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法......
  • C++温故补缺(十二):动态内存
    C++动态内存同C,C++中也是有堆和栈的概念。栈是函数内部声明的所有变量都所占用空间,堆是程序中未使用的内存,在程序运行期间可用于动态分配。同样也有alloc()分配内存,新增......
  • C++温故补缺(十一):异常
    异常处理参考:cnblogs异常和错误(bug)异常:是程序开发过程中必须考虑的一些特殊情况,是程序运行时可以预料的执行分支。异常是不可以避免的,如0除问题,数组越界问题,文件不存在......
  • C++温故补缺(十):C++文件读写和流
    C++文件和流C++文件的读写流用的是fstream库,它定义了三个新的数据类型:数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstr......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很......
  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......
  • 以下是一个使用C++实现HTTP文件下载的简单示例,其中使用了C++ 11的标准库和Boost库:
    #include<iostream>#include<fstream>#include<boost/asio.hpp>usingboost::asio::ip::tcp;intmain(){try{boost::asio::io_serviceio_service;......
  • c++环境
    目录环境准备下装安装vscode及插件安装mingw编译器工作环境准备vscode工作目录调试环境CSDN参考文档环境准备下装安装vscode及插件vscode是微软账号登录的插件配置信息......
  • [C++引用] 保定丽丽带你学C++
    引用是C++内一个比较有用的方法,大家在丽丽的带领下好好学习。一.引用的基本使用C++引用的作用:给变量起别名语法:​​数据类型&名字=原名​​示例:#include<iostream>usi......