Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 Ctrl+C(SIGINT) 이벤트를 포착하는 방법

Ctrl+C는 현재 실행 중인 작업에 인터럽트(interrupt) 신호를 보내는 키 조합입니다. 이 글에서는 C++에서 Ctrl+C 이벤트를 포착(catch)하는 방법을 알아보겠습니다.

시그널(Signal)이란?

Ctrl+C는 C/C++에서 하나의 시그널(signal)로 처리됩니다. 따라서 시그널 포착 기법을 사용하면 이 이벤트를 감지할 수 있습니다. Ctrl+C에 해당하는 시그널 코드는 SIGINT(Signal for Interrupt, 인터럽트용 시그널)입니다.

시그널은 signal() 함수를 통해 포착할 수 있으며, 이 함수에 콜백 함수의 주소를 전달하면 해당 시그널이 발생했을 때 지정한 함수가 자동으로 호출됩니다.

예제 코드

#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <signal.h>
using namespace std;

// Ctrl+C(SIGINT)가 프로세스로 전달될 때 호출될 함수 정의
void signal_callback_handler(int signum) {
    cout << "Caught signal " << signum << endl;
    // 프로그램 종료
    exit(signum);
}

int main() {
    // 시그널과 시그널 핸들러 등록
    signal(SIGINT, signal_callback_handler);
    while(true) {
        cout << "Program processing..." << endl;
        sleep(1);
    }
    return EXIT_SUCCESS;
}

코드 설명

  • signal_callback_handler: SIGINT 시그널이 발생하면 실행되는 콜백 함수입니다. 여기서는 시그널 번호를 출력한 뒤 exit()로 프로그램을 종료합니다.
  • signal(SIGINT, signal_callback_handler): SIGINT 시그널과 핸들러 함수를 연결(등록)합니다.
  • while(true) 무한 루프: 프로그램이 계속 실행되는 상황을 시뮬레이션하여, 사용자가 Ctrl+C를 누를 수 있도록 합니다.

실행 결과

$ g++ test.cpp
$ ./a.out
Program processing...
Program processing...
Program processing...
Program processing...
Program processing...
Program processing...
^CCaught signal 2
$

실행 결과를 보면 프로그램이 무한 루프를 돌다가 사용자가 Ctrl+C(^C)를 입력하는 순간, 등록된 핸들러가 호출되어 "Caught signal 2" 메시지가 출력되고 프로그램이 정상적으로 종료되는 것을 확인할 수 있습니다. 여기서 숫자 2는 SIGINT 시그널의 고유 번호입니다.

추가 팁: sigaction 사용하기

signal() 함수는 간단하지만 플랫폼마다 동작이 다를 수 있습니다. 더 안정적이고 이식성 높은 처리를 원한다면 POSIX 표준의 sigaction() 함수를 사용하는 것이 권장됩니다. 특히 실무 환경에서는 시그널 핸들러 내에서 복잡한 로직을 수행하기보다 종료 플래그만 설정하고, 메인 루프에서 해당 플래그를 확인하는 방식이 안전합니다.