Latest web development tutorials

обработки сигналов C ++

Сигнал передается операционной системой, процесс прерывается, будет досрочное прекращение программы. В UNIX, Linux, Mac OS X или Windows, системы, вы можете нажать кнопку прерывания Ctrl + C.

Некоторые сигналы не могут быть перехвачены процедуры, но перечисленные в таблице ниже сигнала могут быть захвачены в программе, и может принимать соответствующие меры на основе сигнала. Эти сигналы определены в заголовочный файл C ++ <csignal> в.

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

Функция сигнала ()

библиотека C ++ обеспечивает функцию обработки сигналовсигнала для захвата аварийных ситуаций.Ниже приводится функция синтаксиса сигнала ():

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

Эта функция принимает два параметра: первый параметр представляет собой целое число, представляющее число сигнала, второй параметр является указателем на функцию обработки сигнала.

Давайте напишем простую программу на С ++, которая использует функцию сигнала () для захвата сигнала SIGINT. Независимо от того , что вы хотите , чтобы захватить сигнал в вашей программе, вы должны использовать функциюсигнала для регистрации сигнала и обработки сигналов , связанный с программой.Рассмотрим следующие примеры:

#include <iostream>
#include <csignal>

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:

Going to sleep....
Going to sleep....
Going to sleep....

Теперь, нажмите Ctrl + C, чтобы прервать программу, вы увидите захват сигнала программы, и выйти из программы, чтобы напечатать следующее:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

поднять функцию ()

Вы можете использовать функциюрейз () генерирует сигнал, функция сигнала принимает целое число в качестве параметра, следующий синтаксис:

int raise (signal sig);

Здесь, сиг является сигналом для передачи номера Эти сигналы включают в себя: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Вот то, что мы используем рейз () функция генерирует сигнал в пределах экземпляра:

#include <iostream>
#include <csignal>

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

Когда приведенный выше код компилируется и выполняется, он дает следующие результаты, и автоматически выходит:

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.