Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

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

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

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

<тд>

СИГАБРТ

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

<тд>

SIGFPE

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

<тд>

СИГИЛЛ

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

<тд>

SIGINT

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

<тд>

SIGSEGV

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

<тд>

SIGTERM

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

Старший № Сигнал и описание
1
2
3
4
5
6

Функция signal()

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

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

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

Давайте напишем простую программу на C++, в которой мы будем ловить сигнал SIGINT с помощью функции signal(). Какой бы сигнал вы ни хотели поймать в своей программе, вы должны зарегистрировать этот сигнал с помощью 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.

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

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

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

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

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

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

Язык C

  1. Типы данных С++
  2. Операторы С++
  3. С++ Комментарии
  4. Шаблоны классов С++
  5. C Обработка файлов
  6. Обработка исключений C++:пример Try, Catch, Throw
  7. C - Обработка ошибок
  8. Обзор С++
  9. Константы/литералы С++
  10. Операторы в С++