Обработка сигналов С++
Сигналы — это прерывания, доставляемые процессу операционной системой, которые могут преждевременно завершить программу. Вы можете генерировать прерывания, нажав Ctrl+C в системах UNIX, LINUX, Mac OS X или Windows.
Есть сигналы, которые программа не может поймать, но есть следующий список сигналов, которые вы можете поймать в своей программе и предпринять соответствующие действия на основе сигнала. Эти сигналы определены в заголовочном файле C++
Старший № | Сигнал и описание |
---|---|
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