C ++ 신호 처리
신호가 운영 체제에 의해 전달되고, 처리는 프로그램의 것 조기 종료, 중단된다. UNIX, LINUX, 맥 OS X 또는 Windows 시스템에서는 Ctrl + C 인터럽트를 누를 수 있습니다.
일부 신호 절차를 발견하지만, 프로그램을 포착 할 수있는 신호를 아래의 표에, 그리고 상기 신호에 기초하여 적절한 조치를 취할 수있는 수 없다. 이 신호의 C ++ 헤더 파일 <csignal>에 정의되어 있습니다.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
신호 () 함수
C ++ 라이브러리는 비상 사태를 캡처하는신호 신호 처리 기능을 제공합니다.다음 구문 신호 () 함수이다 :
void (*signal (int sig, void (*func)(int)))(int);
이 함수는 두 개의 매개 변수를 사용할 첫 번째 파라미터는 신호의 개수를 나타내는 정수이고, 두번째 파라미터는 신호 처리 기능에 대한 포인터이다.
의는 SIGINT 신호를 캡처하는 신호 () 함수를 사용하는 간단한 C ++ 프로그램을 작성하자. 아무리 당신이 당신의 프로그램에서 신호를 캡처 할 것을, 당신은 신호 및 프로그램과 관련된 신호 처리를 등록신호 기능을 사용하지해야합니다.다음 예를 고려하십시오
#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 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.
() 함수를 제기
만약() 함수 레이즈를 사용하여신호를 생성 할 수 신호 함수 파라미터 다음 구문과 같은 정수를 취
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 sleep...." << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를 생성하고, 자동으로 종료 할 것이다 :
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.