터미널에서 프로그램이 비정상적으로 동작하거나 멈추지 않고 계속 실행될 때, 개발자는 키보드 단축키를 이용해 프로그램을 강제로 종료하거나 일시 중단할 수 있습니다. 이를 위해서는 어떤 단축키를 눌러야 하는지 정확히 알고 있어야 합니다.
실행 중인 코드를 중단하는 데 사용되는 대표적인 키보드 단축키는 다음 두 가지입니다.
1. Ctrl+C — SIGINT 시그널
Ctrl+C는 실행 중인 프로그램을 종료할 때 사용합니다. 진행 중인 입출력(I/O) 작업이 마무리된 후 프로세스에 SIGINT 시그널을 전송하여 실행을 종료합니다. C 언어의 signal() 함수처럼 이 SIGINT 시그널을 직접 처리할 수 있는 방법도 여러 언어에 마련되어 있습니다.
2. Ctrl+Z — SIGTSTP 시그널
Ctrl+Z는 프로그램의 실행을 일시 중단(suspend)할 때 사용합니다. 해당 프로세스와 관련된 모든 작업이 중단되며, 프로세스에는 SIGTSTP 시그널이 전송됩니다. 동작 방식은 Ctrl+C와 유사하지만 더 강력하게 작동하며, 역시 사용자가 직접 처리(handle)할 수 있습니다.
이번 글에서는 Ctrl+Z 입력을 무시하고, 대신 "Ctrl+Z로는 이 코드를 중단할 수 없습니다"라는 메시지를 출력하는 프로그램을 작성해 보겠습니다.
앞서 설명했듯이 C 언어에서는 Ctrl+Z가 발생시키는 SIGTSTP 시그널을 직접 처리할 수 있습니다. 시그널이 호출되더라도 프로그램이 종료·중단되지 않도록 시그널의 기본 동작을 재정의하고, 대신 한 줄의 메시지를 출력하도록 만드는 것입니다.
이러한 시그널 처리에는 signal() 함수를 사용합니다.
예제 코드
#include <stdio.h>
#include <signal.h>
void signalhandler(int sig_num){
signal(SIGTSTP, signalhandler);
printf("Cannot execute Ctrl+Z\n");
}
int main(){
int a = 1;
signal(SIGTSTP, signalhandler);
while(a){
}
return 0;
}
코드 설명
signalhandler()함수는 SIGTSTP 시그널이 발생할 때 호출되는 핸들러입니다.핸들러 내부에서
signal(SIGTSTP, signalhandler)를 다시 호출해 시그널 핸들러를 재등록합니다. 일부 시스템에서는 시그널을 한 번 처리한 뒤 핸들러 등록이 기본값으로 초기화되기 때문에, 안정적인 동작을 위해 재등록 과정이 필요합니다.main()함수에서 먼저signal()로 핸들러를 등록한 후 무한 루프를 실행합니다.
실행 결과
// 무한 루프가 계속 실행되며, // Ctrl+Z를 눌러도 프로그램은 중단되지 않고 // "Cannot execute Ctrl+Z" 메시지만 출력됩니다.
참고로, 이처럼 Ctrl+C와 Ctrl+Z 같은 인터럽트 시그널을 모두 무시하는 프로그램을 종료하려면 별도의 터미널 세션에서 kill 명령어를 사용해야 할 수 있습니다.