C 시그널 처리

표준 라이브러리에서 시그널 처리(signal processing)는 프로그램이 실행 중에 다양한 시그널들을 어떻게 처리하는지를 정의한다. 시그널은 프로그램 내에서 몇몇 예외적인 행위(0으로 나누기 같은)를 보고하거나, 프로그램 외부의 비동기적 이벤트(키보드 키를 누르기 같은)를 보고할 수 있다.

표준 시그널 
C 표준은 단지 6개의 시그널만을 정의한다. 이것들은 모두 signal.h 헤더에 정의되어 있다 (csignal - C++에서):
 SIGABRT - "abort", 비정상적 종료.
 SIGFPE - 부동소수점.
 SIGILL - "illegal", 유효하지 않은 명령어.
 SIGINT - "interrupt", 프로그램에 보내진 상호적인 요청.
 SIGSEGV - "세그멘테이션 오류", 유효하지 않은 메모리 접근.
 SIGTERM - "terminate", 프로그램에 보내진 종료 요청.
추가적인 시그널들도 구현에 따라서 signal.h 헤더에 정의되어 있을 수 있다. 예를 들면 유닉스 계열 운영 체제는 15개 이상의 추가적인 시그널들을 정의한다. .

처리 
시그널은 raise() 또는 kill() 시스템 호출을 호출함으로써 생성될 수 있다. raise() 는 현재 프로세스에 시그널을 보내며, kill() 은 특정한 프로세스에 시그널을 보낸다.

시그널 처리기(핸들러)는 두 개의 시그널(SIGKILL과 SIGSTOP는 잡히거나 무시될 수 없다)을 제외하고는 모두 정의될 수 있다. 시그널 처리기는 상응하는 시그널이 발생되었을 때 대상 환경에 의해 호출되는 함수이다. 대상 환경은 프로그램의 실행을 시그널 처리기가 반환하거나 longjmp()를 호출할 때까지 대기시킨다. 최대한의 호환성을 위해서 비동기적 신호 처리기는 오직 다음을 수행하여야 한다 :
 signal() 함수에 대한 성공적인 호출을 만들어야 한다.
 sig_atomic_t volatile 변수 타입의 객체에 값들을 할당해야 한다.
 호출자에게 제어를 반환해야 한다
만약 시그널이 프로그램 내부에서의 에러를 보고한다면, 시그널 처리기는 abort(), exit(), longjmp()를 호출함으로써 종료될 수 있다.

함수들

사용 예시 
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_function(int signo) {
    puts("Interactive attention signal caught.");
}

int main(void) {
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        fputs("An error occurred while setting a signal handler.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Raising the interactive attention signal.");
    if (raise(SIGINT) != 0) {
        fputs("Error raising the signal.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Exiting.");
    return EXIT_SUCCESS;
    // exiting after raising signal
}

같이 보기 
 유닉스 신호

각주 

C 표준 라이브러리