详细分析C++ 信号处理

 更新时间:2020年07月10日 15:24:23   作者:菜鸟教程  
这篇文章主要介绍了C++ 信号处理的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。

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

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

signal() 函数

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:

void (*signal (int sig, void (*func)(int)))(int);

这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

让我们编写一个简单的 C++ 程序,使用 signal() 函数捕获 SIGINT 信号。不管您想在程序中捕获什么信号,您都必须使用 signal 函数来注册信号,并将其与信号处理程序相关联。看看下面的实例:

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

当上面的代码被编译和执行时,它会产生下列结果:

Going to sleep....
Going to sleep....
Going to sleep....

现在,按 Ctrl+C 来中断程序,您会看到程序捕获信号,程序打印如下内容并退出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

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

当上面的代码被编译和执行时,它会产生下列结果,并会自动退出:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

以上就是详细分析C++ 信号处理的详细内容,更多关于C++ 信号处理的资料请关注脚本之家其它相关文章!

相关文章

  • C++消息队列(定义,结构,如何创建,发送与接收)

    C++消息队列(定义,结构,如何创建,发送与接收)

    这篇文章主要介绍了C++消息队列(定义,结构,如何创建,发送与接收),消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表
    2022-08-08
  • C/C++堆区专篇精讲

    C/C++堆区专篇精讲

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢,让我们一起来看看
    2022-10-10
  • C语言实现返回字符串函数的四种方法

    C语言实现返回字符串函数的四种方法

    在C语言中实现函数返回字符串,首先要确定函数返回的字符串地址的来源,一般分为四种方式,下面这篇文章就给大家通过示例代码详细介绍这几种方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • OpenGL实现中点划线法

    OpenGL实现中点划线法

    这篇文章主要为大家详细介绍了OpenGL实现中点划线法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++11中std::packaged_task的使用详解

    C++11中std::packaged_task的使用详解

    这篇文章主要介绍了C++11中std::packaged_task的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言中有哪些字符处理函数你知道吗

    C语言中有哪些字符处理函数你知道吗

    这篇文章主要为大家详细介绍了C语言字符处理函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 数据结构 红黑树的详解

    数据结构 红黑树的详解

    这篇文章主要介绍了数据结构 红黑树的详解的相关资料,数据结构中的二叉树查找,红黑树的讲解,需要的朋友可以参考下
    2017-07-07
  • c语言实现单链表算法示例分享

    c语言实现单链表算法示例分享

    这篇文章主要介绍了c语言实现单链表算法示例,需要的朋友可以参考下
    2014-02-02
  • C++实现LeetCode(41.首个缺失的正数)

    C++实现LeetCode(41.首个缺失的正数)

    这篇文章主要介绍了C++实现LeetCode(41.首个缺失的正数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 深入解析C++中类的多重继承

    深入解析C++中类的多重继承

    这篇文章主要介绍了深入解析C++中类的多重继承,包括多重继承相关的二义性问题,需要的朋友可以参考下
    2015-09-09

最新评论