Signal 함수와 인터럽트

개요

쉘에서 어떤 프로그램을 실행중 일 때 ctrl-C를 이용하여 프로그램을 종료한다.

그 원리와 방법에 대해 알아보겠다.




signal


  • 함수 원형 : void (signal(int sig, void (func)(int)))(int);
  • 함수 라이브러리 : #include
  • int sig : signal flag
  • void (*func)(int)) : signal 감지시 실행할 함수



signal 종류






signal 설명


SYSIFCOPT(*ASYNCSIGNAL)옵션으로 컴파일하면 비동기 신호를 사용하며 기본적으로 signal 함수는 동기 신호를 감지한다.

신호가 감지되면 두번째 파라메터인 함수를 실행하고 그 함수의 인자로 첫번째 인자값을 넣어준다.



신호 무시


signal(SIGINT, SIG_IGN);와 같은 형식으로 사용하면 SIGINT신호는 무시된다.

두번째 파라메터로 SIG_IGN을 넣어주면 해당 신호를 무시하라는 뜻이다.




ctrl-C


신호의 종류를 보다보면 두번째에 SIGINT가 있다. 이 신호의 설명에는 interrupt program이라고 적혀있는데, 키보드의 의한 인터럽트 신호를 감지하는 것이다.

키보드의 의한 인터럽트 신호는 ctrl-C이다.

활용한 예시

1
2
3
4
5
6
7
8
9
10
11
12
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
 
void sigHandler(int sig){
    exit(0);
}

int main(){
    signal(SIGINT, sigHandler);
    while(1);
}




ctrl-C, ctrl-D and ctrl-\


ctrl-C는 위에서 말한 것처럼 현재의 프로세스에 SIGINT 신호를 보내는 것을 의미하고,

ctrl-D는 표준 입력에 EOF를 의미한다. 그러므로 입력창에 입력을 하면 터미널이 종료가 된다.

ctrl-\는 현재의 프로세스에 SIGQUIT 신호를 보낸다. 그러면 프로그램이 종료된다.