SIGNAL(2)

이름
signal - ANSI C 시그널 처리

사용법
#include <signal.h>

void (*signal(int signum, void (*handler)(int)))(int);

설명
signal 시스템 콜은 signum 번호의 시그널에 대해 새로운 시그널 핸들러를 설치한다. 시그널 핸들러는 handler로 설정되고, 사용자 정의 함수이거나 다음 것중의 하나가 될 수 있다:

    SIG_IGN
        시그널을 무시한다.

    SIG_DFL
        시그널의 초기 기본 동작을 하도록 한다.

시그널 핸드러 루틴에 넘겨지는 정수 인자는 시그널 번호이다. 이는 여러 시그널에 대해 하나의 시그널 핸들러를 사용할 수 있게 한다.

반환값
signal은 이전의 시그널 핸들러의 포인터나, 에러시 SIG_ERR를 리턴한다.

주의
SIGKILL나 SIGSTOP에 시그널 핸들러를 지정할 수 없다.

BSD 시스템과 달리, 리눅스의 시그널은 시그널이 발생했을 때 초기 기본 동작으로 되돌린다. 그러나, <signal.h> 대신에 <bsd/signal.h>를 포함시키면 signal 은 __bsd_signal로 재정의되어 시그널은 BSD에서와 같이 동작한다. signal의 두 가지 버전은 모두 sigaction(2)위에 만들어진 라이브러리 루틴이다.

이 맨페이지의 프로토타입이 이해되지 않는다면 다음과 같이 분리하는 것이 도움이 될지도 모른다:

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

POSIX에 따르면 kill()나 raise() 함수로 발생시킬 수 없는 SIGFPE, SIGILL 또는 SIGSEGV 시그널을 무시한 후 프로세스의 동작을 알 수 없다. 0으로 나눠진 정수는 알 수 없는 결과를 낸다. 어떤 아키텍쳐에서는 SIGFPE 시그널이 발생한다. (-1로 음의 정수를 나누는 것도 SIGFPE를 발생시킨다.) 이 시그널을 무시하면 무한 루프에 빠질 수도 있다.

POSIX (B.3.3.1.3)에 따르면 SIGCHLD에 대한 동작은 SIG_IGN으로 설정해서는 안 된다. 여기서 BSD와 SYSV가 다르다. SIGCHLD의 동작을 SIG_IGN으로 설정하는 BSD 소프트웨어는 리눅스에서는 실패한다.

호환
ANSI C

관련 항목
kill(1), kill(2), killpg(2), pause(2), raise(3), sigaction(2), signal(7), sigsetops(3), sigvec(2), alarm(2)

역자
임종균 <hermes44@secsm.org>, 2000년 4월 20일