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

C언어에서 Ctrl+C로 종료되지 않는 프로그램 만드는 방법


이 글에서는 사용자가 Ctrl+C를 눌러도 프로그램이 종료되지 않고, 대신 "Ctrl + C cannot terminate the program"이라는 메시지를 출력하도록 만드는 방법을 살펴봅니다.

이를 구현하려면 시그널 핸들링(Signal Handling) 기법을 활용해야 합니다. 사용자가 Ctrl+C를 누르면 운영체제가 프로그램에 SIGINT라는 시그널을 전송합니다. 이 시그널을 가로채 직접 처리하면 프로그램이 강제 종료되는 것을 막을 수 있습니다.

동작 원리

C 언어에서는 <signal.h> 헤더 파일에 정의된 signal() 함수를 사용하여 특정 시그널이 발생했을 때 실행될 사용자 정의 함수(핸들러)를 등록할 수 있습니다. 여기서는 SIGINT 시그널이 발생하면 프로그램을 종료하는 대신 메시지를 출력하도록 핸들러를 등록합니다.

핸들러 내부에서 signal(SIGINT, signalHandle)을 다시 호출하는 이유는, 일부 시스템에서는 시그널 핸들러가 한 번 호출된 후 기본 동작으로 초기화되기 때문입니다. 핸들러를 재등록하면 Ctrl+C를 여러 번 눌러도 계속 같은 동작을 수행합니다.

예제 코드

#include <stdio.h>
#include <signal.h>

void signalHandle(int sig_num) {
    /* 시그널 핸들러 재등록 */
    signal(SIGINT, signalHandle);
    printf("\nCtrl + C cannot terminate the program\n");
    fflush(stdout);
}

int main() {
    /* SIGINT 시그널에 대한 핸들러 등록 */
    signal(SIGINT, signalHandle);

    /* 무한 루프로 프로그램 실행 유지 */
    while (1)
        ;

    return 0;
}

실행 결과

Ctrl + C cannot terminate the program

코드 설명

  • signalHandle(): SIGINT 시그널이 발생할 때 호출되는 사용자 정의 핸들러 함수입니다. 프로그램을 종료하지 않고 메시지만 출력합니다.
  • fflush(stdout): 출력 버퍼를 즉시 비워 메시지가 화면에 바로 표시되도록 합니다.
  • while(1): 무한 루프를 통해 프로그램이 계속 실행 상태를 유지하도록 합니다.

참고 사항

실무 환경에서는 signal() 대신 sigaction() 함수를 사용하는 것이 권장됩니다. sigaction()은 이식성이 뛰어나고 시그널 처리를 더욱 세밀하게 제어할 수 있기 때문입니다. 또한 무한 루프로 인해 CPU 자원이 낭비되지 않도록 pause()sleep() 함수를 함께 활용하는 것도 좋은 방법입니다.