Сигналы — это прерывания, доставляемые процессу операционной системой, которые могут преждевременно завершить программу. Вы можете генерировать прерывания, нажав 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; }
Когда приведенный выше код компилируется и выполняется, он выдает следующий результат и будет автоматически получен: