zoukankan      html  css  js  c++  java
  • C++信号处理

    信号是由操作系统传给进程的中断,会提早终止一个程序。在UNIX、LINUX、Mac OS或windows系统上,可以通过按Ctrl+c产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中被捕获,并可以基于信号采取适当的动作。这些信号是定义在C++头文件<csignal>中。

    信号

    描述

    SIGABRT

    程序的异常终止,如调用abort

    SIGFPE

    错误的算术运算,比如除以零或者导致溢出的操作

    SIGILL

    检测非法指令

    SIGINT

    接受到交互注意信号

    SIGSEGV

    非法访问内存

    SIGTERM

    发送到程序的终止请求

    signal()函数

    C++信号处理库提供了signal函数,用来捕获突发事件

    void (*signal (int sig,void (*func)(int)))(int);

    这个函数接收两个参数:第一个参数是一个整数,代表了信号的编号;第二个参数是一个指向信号处理函数的指针。

    /***
    signal.cpp
    ***/
    #include<iostream>
    #include<csignal>
    #include<unistd.h>
    #include<cstdlib>
    
    using namespace std;
    
    void signalHandler(int signum)
    {
        cout << "Interrupt signal (" << signum << ") received.
    ";
    
        exit(signum);
    }
    
    int main()
    {
        signal(SIGINT,signalHandler);
        while(1)
        {
            cout << "Going to sleep..." << endl;
            sleep(1);
        }
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190816$ g++ signal.cpp -o signal

    exbot@ubuntu:~/wangqinghe/C++/20190816$ ./signal

    Going to sleep...

    Going to sleep...

    Going to sleep...

    Going to sleep...

    ^CInterrupt signal (2) received.

    raise()函数

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

    int raise(signal sig);

    在这里,sig是要发送的信号的编号,这些信号包括:SIGINT,SIGBABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP。

    /***
    raise.cpp
    ***/
    #include<iostream>
    #include<csignal>
    #include<unistd.h>
    #include<cstdlib>
    
    using namespace std;
    
    void signalHandler(int signum)
    {
        cout << "Interrupt signal (" << signum << ") received." << endl;
    
        exit(signum);
    }
    
    int main()
    {
        int i = 0;
        signal(SIGINT,signalHandler);
    
        while(++i)
        {
            cout << "Going to sleep..." << endl;
            if(3 == i)
            {
                raise(SIGINT);
            }
            sleep(1);
        }
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190816$ g++ raise.cpp -o raise

    exbot@ubuntu:~/wangqinghe/C++/20190816$ ./raise

    Going to sleep...

    Going to sleep...

    Going to sleep...

    Interrupt signal (2) received.

  • 相关阅读:
    CF1284G
    5-3 Harbor高可用部署 下
    5业务系统迁移kubernetes-----准备工作(平稳迁移做好准备)
    题解-CF1453F Even Harder
    题解-CF961F k-substrings
    Docker 数据卷容器(实现两个或多个容器间数据同步)
    Docker 具名和匿名挂载
    Java-IO中的节点流和处理流
    《机器学习十讲》学习报告二
    rpc基本思路
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11364274.html
Copyright © 2011-2022 走看看