C++ 信号处理
来源:互联网 发布:东方财富dk指标源码 编辑:程序博客网 时间:2024/06/06 14:10
原文地址:http://www.runoob.com/cplusplus/cpp-signal-handling.html
信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。
有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C++ 头文件 <csignal> 中。
signal() 函数
C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:
void (*signal (int sig, 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); } 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> 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.
阅读全文
0 0
- Linux C 信号处理
- Linux C 信号处理
- linux c 信号处理
- Linux C 信号处理
- C语言信号处理
- C++ 处理 Kill 信号、Ctrl+C信号
- 【Linux C】信号及信号处理
- Linux C 信号及信号处理(一)
- C语言中的信号处理
- singlehandler 处理 ctr+c 信号。
- C中信号处理函数
- c的信号处理sigaction
- C语言 信号处理机制
- Linux C 信号处理机制
- 学习笔记之信号及信号处理------linux c
- Linux&C ——信号以及信号处理
- Linux C 函数参考(信号处理)
- Linux常用C信号处理函数
- Linux高级文本处理命令
- [lcm] Qualcomm平台兼容多显示屏lcd的方法&并从lk传输到kernel过程
- hdu 6166 Senior Pan(多源最短路径)(二进制划分集合)
- Spring Boot参考教程(七)Spring Boot Jar方式读取资源文件
- Gmapping学习
- C++ 信号处理
- Web前端性能优化——如何提高页面加载速度
- QIODevice::write: device not open
- 10.6 test solution.
- 深入浅出,java垃圾回收机制
- C++单例的完美实现
- 标签二值化LabelBinarizer
- Java基础:持有对象
- Matlab 快速入门