이 글에서는 사용자가 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() 함수를 함께 활용하는 것도 좋은 방법입니다.