SIGNAL(2) | 리눅스 프로그래머 매뉴얼 | SIGNAL(2) |
이름¶
signal - ANSI C 시그널 처리
사용법¶
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
설명¶
signal 시스템 콜은 signum 번호의 시그널에 대해 새로운 시그널 핸들러를 설치한다. 시그널 핸들러는 handler로 설정되고, 사용자 정의 함수이거나 다음 것중의 하나가 될 수 있다:
시그널 핸드러 루틴에 넘겨지는 정수 인자는 시그널 번호이다. 이는 여러 시그널에 대해 하나의 시그널 핸들러를 사용할 수 있게 한다.
반환값¶
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일
1996년 7월 21일 | 리눅스 2.0 |