Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 신호 처리

<시간/>

신호는 프로그램을 조기에 종료할 수 있는 운영 체제에 의해 프로세스에 전달되는 인터럽트입니다. UNIX, LINUX, Mac OS X 또는 Windows 시스템에서 Ctrl+C를 눌러 인터럽트를 생성할 수 있습니다.

프로그램에서 포착할 수 없는 신호가 있지만 프로그램에서 포착할 수 있고 신호를 기반으로 적절한 조치를 취할 수 있는 신호의 다음 목록이 있습니다. 이러한 신호는 C++ 헤더 파일에 정의되어 있습니다.

신호
설명
SIGABRT
중단 호출과 같은 프로그램의 비정상 종료 .
SIGFPE
0으로 나누기 또는 오버플로를 초래하는 연산과 같은 잘못된 산술 연산.
시질
불법 명령 감지.
시그인트
대화형 주의 신호 수신.
SIGSEGV
저장소에 대한 잘못된 액세스입니다.
시그텀
프로그램에 전송된 종료 요청.

signal() 함수

C++ 신호 처리 라이브러리는 예기치 않은 이벤트를 트랩하는 함수 신호를 제공합니다. 다음은 signal() 함수의 구문입니다 -

void (*signal (int sig, void (*func)(int)))(int);

간단하게 하면 이 함수는 두 개의 인수를 받습니다. 첫 번째 인수는 신호 번호를 나타내는 정수이고 두 번째 인수는 신호 처리 함수에 대한 포인터입니다.

signal() 함수를 사용하여 SIGINT 신호를 잡을 간단한 C++ 프로그램을 작성해 보겠습니다. 프로그램에서 포착하려는 신호가 무엇이든 신호 기능을 사용하여 해당 신호를 등록하고 신호 처리기와 연결해야 합니다. 다음 예를 살펴보십시오 -

예시

#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() 함수

정수 신호 번호를 인수로 사용하고 다음 구문을 사용하는 함수 raise()로 신호를 생성할 수 있습니다.

int raise (signal sig);

여기서 sig는 SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP 신호 중 하나를 보내는 신호 번호입니다. 다음은 다음과 같이 raise() 함수를 사용하여 내부적으로 신호를 발생시키는 예입니다. -

예시

#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.