C++温故补缺(十四):信号处理
信号处理
信号是由操作系统传给进程的中断,能够提前终止一个程序。在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);
}
}
本文来自博客园,作者:Tenerome,转载请注明原文链接:https://www.cnblogs.com/Tenerome/p/cppreview14.html