C++学习笔记(10)-信号处理&多线程

来源:互联网 发布:淘宝详情页上面 编辑:程序博客网 时间:2024/05/16 18:38

信号处理

C++信号处理主要用来捕捉系统产生的异常信号之后进行处理,它的头文件是
#include <csignal>
C++主要是靠signal()函数来捕获异常信号,signal()函数能够捕获的异常信号包括如下信号:

信号标识符 说明 SIGILL 检测非法指令 SIGINT 接收到交互注意信号 SIGFPE 错误的算术运算,比如除以零或导致溢出的操作 SIGSEGV 非法访问内存 SIGTERM 发送到程序的终止请求 SIGABRT 程序的异常终止,如调用 abort。

C++ 信号处理库提供了 signal 函数,用来捕获突发事件。以下是 signal() 函数的语法:
void (*signal (int sig, void (*function)(int)))(int);
注意function函数的传入参数是int类型的
例子

#include <iostream>#include <csignal>using namespace std;void chuli(int signum){    cout << "已捕捉到信号(" << signum << ") received.\n";    exit(signum);}int main(){    // 注册信号 SIGINT 和信号处理程序  SIGINT信号不能够换成其他的,不然CTRL+C程序无法捕捉    signal(SIGINT, chuli);    while (1) {        cout << "hello" << endl;    }    return 0;}

结果

hellohellohellohellohellohellohello已捕捉到信号(2) received.

可以使用 raise(SIG) 生成一个信号,

int raise (signal sig);  //其中的sig可以是上述表格中的任何一个

例子:

#include <iostream>#include <csignal>using namespace std;void chuli(int signum){    cout << "已捕捉到信号(" << signum << ") received.\n";    exit(signum);}void chuli2(int signum){    cout << "已捕捉到信号ILL(" << signum << ") received.\n";    exit(signum);}int main(){    int a=1;    // 注册信号 SIGINT 和信号处理程序    signal(SIGINT, chuli);    signal(SIGILL, chuli2);    while (a++) {        cout << "hello" << endl;        if(a == 5)            raise(SIGILL);    }    return 0;}

结果:

hellohellohellohello已捕捉到信号ILL(4) received.
原创粉丝点击