Przetwarzanie sygnału C ++
Sygnał przekazywany jest przez system operacyjny, proces zostanie przerwany, będzie wcześniejsze zakończenie programu. W systemie UNIX, Linux, Mac OS X lub systemach Windows, można nacisnąć kombinację klawiszy Ctrl + C przerwanie.
Niektóre sygnały nie mogą być łowione procedury, ale w tabeli poniżej sygnału mogą być ujęte w programie i może podjąć odpowiednie działania w oparciu o sygnał. Sygnały te są zdefiniowane w C ++ pliku nagłówkowym <csignal> w.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
Sygnał function ()
biblioteka C ++ dostarczasygnału funkcji przetwarzania sygnału, aby uchwycić się ratownictwem.Poniżej znajduje się funkcja sygnału składni ():
void (*signal (int sig, void (*func)(int)))(int);
Funkcja ta przyjmuje dwa parametry: pierwszy parametr jest liczbą całkowitą reprezentującą liczbę sygnał, drugi parametr jest wskaźnikiem do funkcji przetwarzania sygnału.
Załóżmy napisać prosty program w C ++, który używa funkcji signal (), aby przechwycić sygnał SIGINT. Bez względu na to, co chcesz, aby uchwycić sygnał w swoim programie, należy użyć funkcjisygnału do rejestracji sygnału i przetwarzania sygnału związanego z programem.Rozważmy następujące przykłady:
#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 sleepplpl" << endl; sleep(1); } return 0; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Going to sleepplpl Going to sleepplpl Going to sleepplpl
Teraz naciśnij Ctrl + C, aby przerwać program, zobaczysz przechwytywanie sygnału programu i zamknąć program do drukowania, co następuje:
Going to sleepplpl Going to sleepplpl Going to sleepplpl Interrupt signal (2) received.
podniesienia function ()
Można użyćpodbicie funkcyjny ()generuje sygnał, funkcja sygnału zajmuje całkowitą liczbę jako parametr, o następującej składni:
int raise (signal sig);
Tutaj porządek jest sygnał do przesyłania numerów Sygnały te obejmują: SIGINT, SIGABRT, SIGFPE, SIGILL , SIGSEGV, SIGTERM, SIGHUP.Oto co używamy raise () funkcja ta generuje sygnał w instancji:
#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 sleepplpl" << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
Jeżeli powyższy kod jest kompilowany i wykonywany, to daje następujące wyniki i automatycznie wyjść:
Going to sleepplpl Going to sleepplpl Going to sleepplpl Interrupt signal (2) received.