만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/ETC

[UNIX] signal() 함수와 signal handler 를 사용해보자

D36choi 2020. 6. 4. 17:39
728x90

SIGNAL?

Signal 은 비동기적 이벤트에 대한 handling(처리) 를 가능하게 만든다.

 

모든 Signal 은 이름이 있다. 그리고 이 이름들은 모두 정수로 연결되어있다.

 

signal(SIGNAL, sigHandlerFunc);

첫번째 인자로는 처리하고자하는 Signal 이름, 두번째는 해당 시그널이 들어왔을때 내가 하고자 하는 내용을

담은 함수를 넣어준다.

이 때 이 함수는 integer 변수 1개를 인자로 받는 void 함수이어야 한다.

 

 

SIGFPE 를 처리하는 함수 예제

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

static void sig_fpe(int);

int main(){
    pid_t pid; int i;
    signal(SIGFPE, sig_fpe);

    i = i/0;
}

static void sig_fpe(int signo)
{
    pid_t pid;
    int stat;
    printf("DIVIDE BY ZERO ERROR!\n");

    exit(1);

}

SIGFPE 는 Floating Point Error 를 의미한다.

이 경우에는 i = i/0 이 해당 에러를 유발한다. 0으로 나누면 산술적 오류가 발생하기 때문이다.

만약 해당 시그널 처리를 하지 않으면 프로그램 실행시 

 

Floating point exception (core dumped)

 

라는 에러가 출력되게 될 것이다.

 

위처럼 시그널핸들러 함수를 정해주면, exit(1) 은 프로세스가 비정상적인 결과로 종료되도록 한다.

 

위 코드 실행시 출력:

 

DIVIDE BY ZERO ERROR!