您现在的位置是:首页 > 技术文章网站首页技术文章

[C++]信号处理

  • WangYe
  • 2020-09-01 15:05:29
  • 289 次阅读
了解C++信号捕获和生成;

1.信号捕获

    信号是由操作系统传给进程的中断,会提前终止一个程序.可以通过Ctrl+C产生中断;

信号描述
SIGABRT程序的异常终止,如调用 abort
SIGFPE错误的算术运算,比如除以零或导致溢出的操作。
SIGILL检测非法指令。
SIGINT程序终止(interrupt)信号。
SIGSEGV非法访问内存。
SIGTERM发送到程序的终止请求。

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

void (*signal(int sig,void(*func)(int)))(int);
容易理解格式:
signal(registered signal,signal handler);

参数:
registered signal:一个整数,代表信号编号;
signal handler:一个指向信号处理函数的指针;

实例:

#include <iostream>
#include <csignal>
#include <unistd.h>

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

Ctrl+C 终止获取 运行结果:

图片.png


2.生成信号

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

int raise(signal sig);

参数:
sig:要发送的信号的编号,这些信号包括:SIGINT,SIGABRT,SIGFPE,SIGILL,SIGSEGV,SIGTERM,SIGHUP;

实例:

#include <iostream>
#include <csignal>
#include <unistd.h>

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

运行结果:

图片.png

注:Linux 用 #include <unistd.h> 和 sleep(),Windos 用 #include <windows.h> 和 Sleep()。

文章评论 (0)



Top