Wednesday, May 14, 2008

Signals, brief

Signal은 비동기적인 이벤트를 핸들링하는 매커니즘을 제공하는 Software Interrupt이다. Signal은 IPC의 원시적인 형태라고 봐도 된다. Unix의 역사상 Signal의 구현은 여러 갈래로 나누어 지려 했으나, 다행히 POSIX에서 표준을 제공하고, 이를 Linux에서 제공하고 있다.

일단 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