Лучшее руководство по обработки сигналов C ++ в 2024 году. В этом руководстве вы можете изучить Функция сигнала (),поднять функцию (),
Сигнал передается операционной системой, процесс прерывается, будет досрочное прекращение программы. В UNIX, Linux, Mac OS X или Windows, системы, вы можете нажать кнопку прерывания Ctrl + C.
Некоторые сигналы не могут быть перехвачены процедуры, но перечисленные в таблице ниже сигнала могут быть захвачены в программе, и может принимать соответствующие меры на основе сигнала. Эти сигналы определены в заголовочный файл C ++ <csignal> в.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
библиотека C ++ обеспечивает функцию обработки сигналовсигнала для захвата аварийных ситуаций.Ниже приводится функция синтаксиса сигнала ():
void (*signal (int sig, void (*func)(int)))(int);
Эта функция принимает два параметра: первый параметр представляет собой целое число, представляющее число сигнала, второй параметр является указателем на функцию обработки сигнала.
Давайте напишем простую программу на С ++, которая использует функцию сигнала () для захвата сигнала SIGINT. Независимо от того , что вы хотите , чтобы захватить сигнал в вашей программе, вы должны использовать функциюсигнала для регистрации сигнала и обработки сигналов , связанный с программой.Рассмотрим следующие примеры:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(1){ cout << "Going to sleepruru" << endl; sleep(1); } return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:
Going to sleepruru Going to sleepruru Going to sleepruru
Теперь, нажмите Ctrl + C, чтобы прервать программу, вы увидите захват сигнала программы, и выйти из программы, чтобы напечатать следующее:
Going to sleepruru Going to sleepruru Going to sleepruru Interrupt signal (2) received.
Вы можете использовать функциюрейз () генерирует сигнал, функция сигнала принимает целое число в качестве параметра, следующий синтаксис:
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"; // 清理并关闭 // 终止程序 exit(signum); } int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(++i){ cout << "Going to sleepruru" << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующие результаты, и автоматически выходит:
Going to sleepruru Going to sleepruru Going to sleepruru Interrupt signal (2) received.