일상에서 Signal이란 하나의 의미만을 내포하며 간단하고 빠르게 의미가 전달되는 표시(1:1 매칭)를 의미한다.
이것은 컴퓨터에서도 동일하게 작동한다. 프로세스가 다른 프로세스에게 신호를 보낼때 사용한다.
컴퓨터 내부에서 Signal은 비동기적인 event를 전달하기위해 사용된다.
일단 Signal이 전달되면 유저와 커널에서는 각각 상이한 방식으로 signal을 처리한다.
1) User's view
유저 모드 -> signal 발생 -> 유저 프로그램 멈춤 -> signal handler 실행 -> 프로그램이 종료되거나 유저모드로 돌아감
2) Kernel's view
이벤트 발생 -> signal이 발생했음을 표시 (SIGSEGMENT) -> signal handler 실행 -> 프로그램이 종료되거나 유저모드로 돌아감
signal은 커널에서 유저에게로, 유저에게서 유저에게로(자신에게도 포함) 전달이 가능하다.
(이런 점을 종합해 볼때, signal 은 함수를 호출하는 것과 비슷한 처리를 하는것이 아닐까? 라는 생각을 해본다.. )
일단 시그널이 전달되면, 시그널을 처리하는 Signal Handler 가 실행된다. 일반적으로 프로세서에서 Signal Handler 를 따로 정의하는 경우가 드물기 때문에, 보통 signal마다 존재하는 default handler가 실행되게 된다. 사실 Signal이라는 것이 보통 error가 발생했을때 나타나는 것으로 대부분이 Kernel 단계에서 처리하게된다. 따라서 Signal Handler는 default로 실행되는 경우가 많다고 본다.
signal 의 종류가 워낙 많기에 주요한 signal만 정리해보자
Signal Name | Reason of a signal | Value | Default Handler | |
---|---|---|---|---|
SIGABRT | Program abort ( abort ( ) ) | 6 | Core-dump & exit | abort 발생시 호출 |
SIGALRM | Timer alarm | 14 | Exit | 타이머 발생 |
SIGCHLD | Death of a child process | 17 | Ignore | child 프로세서가 종료되거나 exit 됐을 경우 발생 |
SIGCONT | Continue a stopped process | 18 | Restart / Ignore | 프로그램 계속 실행 |
SIGILL | Not an instruction | 14 | Exit | 명령어를 수행하지 못할 경우 |
SIGINT | ^C | 2 | Exit | ^C 눌렀을때 |
SIGKILL | immediate kill request | 9 | Exit | 프로그램 즉시 종료 |
SIGIPIPE | write attempt with no reader | 13 | Exit | 권한 없는데 쓰려고 할때 |
SIGEGV | illegal memory access | 11 | Core-dump & Exit | 비정상적 메모리 접근 |
SIGSTOP | Stop | 19 | Stop | 프로세스 멈췄을때 |
SIGUSR1 | User defined signal 1 | 10 | Exit(Default) | 유저 정의 handler |
SIGUSR2 | User defined signal 2 | 12 | Exit(Default) | 유저 정의 handler |
처리할 Signal handler 함수를 정의하는 함수 ( signal을 보내는게 아님을 주의하자 ! )
정상적으로 처리됐을 경우 기존의 handler 함수의 주소가 반환되고, 그러지 않을경우 SIG_ERR이 반환된다.
signal handler는 오직 한번만 사용할 수 있다.
한번 사용된 이후 default handler 가 실행된다.
!! kill 함수의 경우 프로세스를 죽이는 것같이 생겼지만.. 시그널을 보내주는 함수이다.
정상적으로 처리됐을 경우 0이 반환되고, 그러지 않을경우 -1이 반환된다.
pid 의 경우 0보다 클 경우 pid 프로세서, 0 일 경우 group 내의 모든 프로세서, -1 일 경우 init을 제외한 모든 프로세서를 의미한다.
signal을 자신에게 전달하는 함수이다.
정상적으로 처리됐을 경우 0이 반환되고, 그러지 않을경우 -1이 반환된다.
매개변수로 전달되는 초 이후 SIGALRM을 자신에게 보낸다.
기존에 alarm 함수가 있을 경우 대체가 되고, alarm(0)이 실행될 경우 모든 알람이 해제된다.
SIGABRT 를 발생시킨다. >> core dump and exit
어떠한 signal이 올때까지 기다린다.
default handler가 사용되었을 경우 프로세스가 종료되고, 유저 정의 handler가 사용됐을 경우 signal 발생 이후로 되돌아간다.