C++ 信号处理

作者: 编程小世界 | 来源:发表于2019-06-18 21:52 被阅读1次

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

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

**

signal() 函数

**

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

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

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

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

#include<iostream>#include<csignal>using namespace std;void signalHandler( int signum ){cout<<"Interrupt signal ("<< signum <<") received.\n";// 清理并关闭// 终止程序  exit(signum);  }intmain(){// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler);while(1){cout<<"Going to sleep...."<

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

Goingtosleep....Goingtosleep....Goingtosleep....

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

Goingtosleep....Goingtosleep....Goingtosleep....Interrupt signal (2) received.

raise() 函数

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

intraise(signal sig);

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

#include<iostream>#include<csignal>using namespace std;void signalHandler( int signum ){cout<<"Interrupt signal ("<< signum <<") received.\n";// 清理并关闭// 终止程序 exit(signum);  }intmain(){inti =0;// 注册信号 SIGINT 和信号处理程序signal(SIGINT, signalHandler);while(++i){cout<<"Going to sleep...."<

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

Goingtosleep....Goingtosleep....Goingtosleep....Interrupt signal (2) received.

看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具

每晚8点直播讲解C++编程技术。非常感谢大家的关注

相关文章

  • C++ 信号处理

    信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows...

  • C++高级编程(信号处理)

    转自:http://www.runoob.com/cplusplus/cpp-signal-handling.ht...

  • Qt Quick 学习笔记(二) QML与C++双向对接

    QML→C++的对接 信号槽机制 大部分情况下,用户对QML的操作,需要调用对应的C++函数进行处理。QML上的操...

  • addr2line命令

    在Linux下写C/C++程序的程序员,时常与CoreDump相见。在内存越界访问,收到不能处理的信号,除零等错误...

  • 记一次SIGSEGV引发的悲剧

    在C/C++的项目线上环境部署的时候,都会使用minidump的机制,来避免进程宕掉。比如,注册各种信号处理函数,...

  • 信号处理

    信号处理

  • 信号与信号处理

    两本书 近期连续阅读两本有关如何处理市场“信号”的书,一本是信号-社会契约与地缘政治如何影响世界经济,一本是宽客-...

  • 信号二

    信号的几种状态 抵达:表示一个信号到达,要处理的信号。阻塞:表示当信号到达时使信号阻塞,当解除阻塞时再处理信号,阻...

  • 学习笔记:信号处理

    信号处理是对各种类型的电信号,按照预期目的和要求进行加工过程的统称。对模拟信号的处理称为模拟信号处理,对数字信号的...

  • (五)C++中的异常处理与模板类

    C++中的异常处理与模板类 一、C++ 中的异常处理 1、异常处理 在C++ 中可以抛出任何类型的异常,根据抛出的...

网友评论

    本文标题:C++ 信号处理

    本文链接:https://www.haomeiwen.com/subject/xaaqqctx.html