Latest web development tutorials

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.