일단 Signal이 발생하면 커널은 전달 가능한 상태가 될 때까지 기다렸다가 이를 해당 프로세스에 전달해준다. Signal의 처리는 아래 세가지 방식으로 진행된다.
- 무시한다.
- 잡아서 처리한다.
- Default로 처리되게 둔다.
Signal 관련 함수들은 signal.h 에 정의되어 있고, kill()함수를 통해 보낼 수 있다. 쉘에서도 kill 을 통해 보낼 수 있으며, -l옵션으로 그 종류를 볼 수 있다. 각각의 signal을 간략히 정리해보면,
SIGABRT 코어내고 종료. assert(), abort() 호출시 이 signal 발생
SIGALRM alarm(), setitimer() with ITIMER_REAL
SIGBUS 이전에는 비메모리 시스템 에러였는데, 지금은 mmap()안된 영역 접근시 발생한다.
SIGCHLD default로는 무시되나, wait() 호출시 child 종료되면 발생
SIGCONT 프로세스 중단 후 재시작시 발생. 터미널, 에디터에서 refresh위해 사용함
SIGFPE floating point 관련 에러
SIGHUP 세션 종료시 발생. 많은 daemon 프로그램에서 이를 사용해서 conf 파일을 다시 읽게 함(convention) 예. apache에서 SIGHUP 받으면 httpd.conf 읽음
SIGILL illegal machine instruction
SIGINT Ctrl-C
SIGKILL
SIGPIPE PIPE 만들어 쓰고 있는데, 받는쪽이 종료한 경우 발생. default로는 종료됨
SIGPROF profiling timer expires (setitimer() with ITIMER_PROF)
SIGPWR low-bat, UPS system -> init process -> system terminate
SIGQUIT Ctrl-\ 모든 foreground 프로세스에게 전달. (코어 후 종료)
SIGSEGV Segmentation Violation
SIGSTOP kill에의해서만 보내질 수 있음. (무시안됨)
SIGSYS invalid system call (최신 바이너리를 오래된 커널에서 돌리지 않는 이상 거의 일어날 일이 없음)
SIGTERM 바로 종료 (이걸 catch 하면 manner 없음 ㅡ.ㅡ;)
SIGTRAP when it cross breakpoint
SIGTSTP Ctrl-z
SIGTTIN, SIGTTOU bg job 들이 읽거나 쓰려고 하는 경우 발생
SIGURG 소켓에 OOB(out of band) 데이터 들어오면 발생
SIGUSR1 SIGUSR2 user-defined purpose
SIGVTALRM setitimer() 관련 signal
SIGWINCH terminal window 값이 바뀐 경우 발생(예, top해놓고 터미널 사이즈를 조절할 때 화면 refresh를 위해 발생).
SIGXCPU 프로세스가 soft processor limit를 초과할 때 발생 (1초에 한번씩 계속.. hard limit까지 넘으면, SIGKILL받고 죽음)
SIGXFSZ process가 file size limit을 넘을 때 발생
No comments:
Post a Comment