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

C++信号处理

时间:2024-07-19 16:07:16浏览次数:11  
标签:raise signal 程序 C++ 信号 include 信号处理 函数

  1. 什么是信号
    #include <csignal> #include <signal.h> 是处理信号的C-library。该库包含 signal 与 raise 两个功能函数。

I. 函数 signal 用于捕获信号,可指定信号处理的方式。
II. 函数 raise产生一个信号,并向当前正在执行的程序发送该信号。

signal()函数

信号 signal 可以理解为由操作系统传给程序(进程)的事件,只是用来通知程序发生了什么事件,并不会传递给该进程任何数据。
信号是一种中断,因为它可以改变程序的流程。当信号传递给进程时,进程将停下其正在执行的操作,并去处理或忽略该信号异步事件。

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

实例:

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

using namespace std;

void signalHandler( int signum )
{
    cout << "Interrupt signal (" << signum << ") received.\n";
    // 清理并关闭
    // 终止程序
   exit(signum);
}
int main ()
{
    // 注册信号 SIGINT 和信号处理程序
    signal(SIGINT, signalHandler);  
    while(1){
       cout << "Going to sleep...." << endl;
       sleep(1);
    }
    return 0;
}

raise() 函数

您可以使用函数 raise() 生成信号,该函数带有一个整数信号编号作为参数,语法如下:

int raise (signal sig);
在这里,sig 是要发送的信号的编号,这些信号包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。以下是我们使用 raise() 函数内部生成信号的实例:

实例:

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

标签:raise,signal,程序,C++,信号,include,信号处理,函数
From: https://www.cnblogs.com/checha/p/18311685

相关文章

  • C++ 智能指针简单实现
    #pragmaoncetemplate<typenameTR>classjoker_shared_ptr{private:TR*ptr;size_t*count;public:constexprjoker_shared_ptr(/*args*/)noexcept{}constexprjoker_shared_ptr(std::nullptr_t)noexcept{}explicitjoker_sha......
  • C++ 的 const 重载
    #include<iostream>#include<string>namespace{classA{public:constA&get_self()const{std::cout<<"常量版本"<<std::endl;return*this;}A......
  • 【C++】C++标准库iostream中cin、cout、cerr、clog方法解析
    目录一.iostream库介绍1.iostream主要的组件2.使用 iostream 二.cin介绍及使用三.cout介绍及使用四.cerr介绍及使用五.clog介绍及使用一.iostream库介绍1.iostream主要的组件在C++中, iostream 是一个非常核心的头文件,它定义了基本的输入输出流。这个头文件是......
  • 算法刷题笔记 字符串哈希(C++实现)
    文章目录题目描述基本思路实现代码题目描述给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符......
  • 算法刷题笔记 八数码(C++实现)
    文章目录题目描述基本思路实现代码题目描述在一个3×3的网格中,1∼8这8个数字和一个x恰好不重不漏地分布在这3×3的网格中。例如:123x46758在游戏过程中,可以把x与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下......
  • C++(指针函数、函数指针)
    目录1.指针函数2.函数指针3.区别总结在C++中,指针函数和函数指针是两个不同的概念,尽管它们的名字非常相似。以下是详细的介绍和区别:1.指针函数指针函数(Pointertoafunction)是返回类型为指针的函数。它的返回值是一个指向某种数据类型的指针。以下是一个示例:int*get......
  • C++预处理器
    C++预处理器预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是C++语句,所以它们不会以分号(;)结尾。C++还支持很多预处理指令,比如#include、#define、#if、#else、#line......
  • 开源 C++ 框架 Ocean:用于计算机视觉和增强现实
    Facebook开源了其内部用于计算机视觉(CV)和增强现实(AR) 应用程序的框架Ocean,用于执行各种任务,包括计算机视觉、几何、媒体处理、网络和渲染。Ocean主要使用C++编写,且不依赖于特定平台:Ocean是一个独立于平台的框架,支持所有主要操作系统,包括iOS、Android、Quest......
  • C++ 函数重载注意事项
    C++中的函数重载(FunctionOverloading)是一种允许同一作用域内存在多个同名函数,但是这些函数的参数列表(参数的类型、个数或顺序)必须不同。这使得函数可以根据传入参数的不同而执行不同的任务。然而,在使用函数重载时,需要注意以下几个重要事项:参数列表必须不同:函数的参数个数、......
  • 探讨C++中巧妙的边界条件处理:以花坛种花问题为例【巧妙思想、边界条件】
    在算法题中,处理数组的边界条件是一个常见的挑战。特别是在涉及多条件判断时,如何高效且清晰地处理边界问题,可以显著提升代码的简洁性和可读性。本文将以一道经典的算法题——花坛种花问题,来探讨边界条件的巧妙处理方法。问题描述605.种花问题-力扣(LeetCode)给定一个由......