Учебники

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

Сигналы — это прерывания, доставляемые процессу операционной системой, которые могут преждевременно завершить программу. Вы можете генерировать прерывания, нажав Ctrl + C в системах UNIX, LINUX, Mac OS X или Windows.

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

Sr.No Сигнал и описание
1

SIGABRT

Аварийное завершение программы, например, вызов для прерывания .

2

SIGFPE

Ошибочная арифметическая операция, такая как деление на ноль или операция, приводящая к переполнению.

3

SIGILL

Обнаружение незаконной инструкции.

4

SIGINT

Получение интерактивного сигнала внимания.

5

SIGSEGV

Неверный доступ к хранилищу.

6

SIGTERM

Запрос на прекращение отправлен в программу.

SIGABRT

Аварийное завершение программы, например, вызов для прерывания .

SIGFPE

Ошибочная арифметическая операция, такая как деление на ноль или операция, приводящая к переполнению.

SIGILL

Обнаружение незаконной инструкции.

SIGINT

Получение интерактивного сигнала внимания.

SIGSEGV

Неверный доступ к хранилищу.

SIGTERM

Запрос на прекращение отправлен в программу.

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

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

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

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

Напишем простую программу на C ++, где мы будем ловить сигнал SIGINT с помощью функции signal (). Какой бы сигнал вы ни хотели поймать в своей программе, вы должны зарегистрировать этот сигнал, используя функцию сигнала, и связать его с обработчиком сигнала. Изучите следующий пример —

#include <iostream>
#include <csignal>

using namespace std;

void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   // register signal SIGINT and signal handler  
   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.

Функция повышения ()

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

int raise (signal sig);

Здесь 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";

   // cleanup and close up stuff here  
   // terminate program  

   exit(signum);  
}

int main () {
   int i = 0;
   // register signal SIGINT and signal handler  
   signal(SIGINT, signalHandler);  

   while(++i) {
      cout << "Going to sleep...." << endl;
      if( i == 3 ) {
         raise( SIGINT);
      }
      sleep(1);
   }

   return 0;
}

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