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