산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 신호 처리

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

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

Sr.No 신호 및 설명
1

시가브트

중단 호출과 같은 프로그램의 비정상 종료 .

2

SIGFPE

0으로 나누기 또는 오버플로가 발생하는 연산과 같은 잘못된 산술 연산입니다.

3

시질

불법 명령 감지.

4

시그인트

양방향 주의 신호 수신

5

SIGSEGV

저장소에 대한 잘못된 액세스입니다.

6

시그텀

프로그램에 종료 요청이 전송되었습니다.

signal() 함수

C++ 신호 처리 라이브러리는 신호 기능을 제공합니다. 예상치 못한 사건을 포착하기 위해. 다음은 signal() 함수의 구문입니다. -

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

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

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

#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);

자, 시호 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.

C 언어

  1. C++ 데이터 유형
  2. C++ 연산자
  3. C++ 주석
  4. C++ 클래스 템플릿
  5. C 파일 처리
  6. C++ 예외 처리:시도, 캐치, 던지기 예제
  7. C - 오류 처리
  8. C++ 개요
  9. C++ 상수/리터럴
  10. C++의 연산자