■ 시그널은 UNIX 시스템에서 지원하는 소프트웨어 인터럽트이다. 시그널을 통해 프로세스간 이벤트를 전달하여 통신수단으로 이용할 수 있다.

(1) 시그널의 발생 및 종류
: 시그널은 아래 4가지 경우에 발생한다.

○ 외부에 의해서
UNIX 시스템에서 키보드에 의해 발생된 시그널은 포그라운드 모드로 실행중인 프로세스 그룹 내의 모든 프로세스에게 전달된다. 시그널을 전달받은 프로세스는 기본적으로 실행이 정지되거나, 종료된다. 이와같은 이유에서 UNIX 시스템에서 동작하는 데몬 프로세스는 백그라운드 모드로 실행되도록 구성한다.
시그널 을 발생시키는 키보드 입력은 Ctrl 키와 함께 조합하여 구성된다. (ex) Ctrl+c , Ctrl + z 등

○ 에러에 의해서
메모리를 잘못 참조하는 등의 잘못된 로직으로 구현된 프로그램으로부터 에러가 발생했을 때 커널은 시그널을 발생시켜 비정상적으로 동작하는 프로세스에게 전달한다. 시그널을 전달받은 프로세스는 종료된다. 이런 경우는 프로그램 로직이 원인이므로 개발시 프로그래머의 주의가 필요하다.

○ 이벤트에 의해서
프로세스의 종료나 알람과 같이 이벤트가 발생하면 프로세스는 시그널을 발생시킬 수 있다. 프로세스가 종료되는 경우, 자신을 생성한 부모 프로세스에게 시그널을 전달하고, 부모 프로세스는 종료 상황과 원인을 알게 된다. 이를 이용하면 비정상적으로 종료되는 프로세스에 대해 예외 처리를 할 수 있다.

○ 인위적으로 
kill 명령에 의해 인위적으로 시그널을 발생시킬 수 있다. 시그널은 프로세스에게 전달되는 것이므로 해당 시그널이 전달될 프로세스의 PID를 필요로 한다.

=> 시그널 통신의 구조는 '시그널 발생 프로세스' 와 '시그널 수신 프로세스'로 구분된다. 이때 시그널을 수신하는 프로세스는 수신할 시그널에 대한 정책이 필요하다. 비정상 종료를 유도하는 시그널은 무시하고, 약속된 시그널에 대해서는 실행 할 모듈을 정의해야 한다.


(2) 시그널 발생 명령어 : kill

○ 명령 형식 : $ kill [-signal number or name] [PID]
○ 시그널 종류 (Name & Number)
- SIGINT(2) : [Ctrl+c] 조합키를 통해 발생된 시그널로, 포그라운드 모드의 프로세스그룹에 전달. (default 종료)
- SIGKILL(9) : 프로세스 종료 시그널 (무시하거나 임의 처리 불가)
- SIGSTOP(23) : 프로세스 정지 시그널 (무시하거나 임의 처리 불가)
- SIGTERM(15) : 프로세스 종료 시그널 (default는 프로세스 종료)
- SIGFPE(8) : 산술 연산 에러를 발생시긴 프로세스에게 전달되는 커널 시그널
- SIGCHLD(18) : 프로세스의 종료나 정지의 경우 부모 프로세스에게 전달되는 시그널
- SIGALRM(14) : alarm() 함수가 설정된 타이머에 의해 발생되는 시그널
- SIGQUIT(3) : [Ctrl+\] 조합키를 통해 발생된 시그널로, 포그라운드 모드의 프로세스그룹에 전달 (default 종료 / core 파일 생성)
- SIGSEGV(11) : 잘못된 메모리를 참조한 프로세스에게 전달되는 커널 시그널
- SIGHUP(1) : 터미널 연결이 끊어지는 경우에 발생되는 시그널로 최근에는 환경설정 파일의 재설정에 사용
-시그널 옵션이 생략 될 경우, SIGTERM 시그널이 발생

(Example)
$ kill -9 1820
$ kill -KILL 1820 (Name을 인수로 사용될 경우 앞에 SIG는 생략한다.)


(3) 시그널 통신을 사용하는 경우

○ 데몬 프로세스의 정상적인 종료를 위해서
○ 데몬 프로세스의 환경 설정 파일을 수정하기 위해서 (SIGHUP)
○ 프로그램을 디버깅하기 위해서 (SIGKILL)
○ 프로세스 간의 동기화를 위해서

=> 커널과 시스템 관리자는 모든 프로세스에게 시그널을 보낼 수 있지만, 일반 프로세스는 동일한 UID와 GID를 갖는 프로세스 또는 같은 프로세스 그룹 내의 프로세스에게만 시그널을 보낼 수 있다.


by 민트앤라떼 2013. 1. 31. 21:31