Fork me on Github Fork me on Gitee

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

}

posted @ 2023-03-20 23:19  Tenerome  阅读(34)  评论(0编辑  收藏  举报