[Unix/Linux] Signal 의 종류

2021. 2. 27. 11:36W.IT/W.유닉스

 signal은 어떠한 조건에 대응하여 유닉스 시스템이 발생시키는 이벤트이며 프로세스는 어떠한 signal을 받는가에 따라 다음 행동을 취합니다. 

 signal은 여러 에러 조건에 의해 shell이나 signal을 발생시키는 터미널 처리기에 의해 발생합니다. 또한, 하나의 프로세스에서 다른 프로세스에게 정보를 전달하거나, 행동을 변경시키기 위한 방편으로도 signal을 보낼 수 있습니다.

 

 signal의 이름들은 signal.h 헤더 파일에 정의되어 있으며, 'SIG' 로 시작합니다.

 

signal name description (default action)
SIGKILL 현재 활동중인 프로세스를 강제로 종료시킬 때 사용되며 이 signal은 프로세스가 포착하거나 무시할 수 없습니다.
SIGHUB 터미널 접속이 끊어질 때 제어하는 프로세스에게 전달되거나 터미널 종료시에 제어하는 프로세스가 각각의 전면 프로세스에게 보냅니다.
SIGALRM alram 함수에서 타이머를 설정하여 발생시킨 signal입니다.
SIGINT 일반적으로 ctrl+c 를 입력할 경우에 터미널에서 발생하는 signal입니다.
SIGPIPE Reader가 없는(연결이 끊어진) 파이프에 write를 할 때 발생합니다.
SIGTERM 프로세스에게 종료를 요철할 때 보내는 signal입니다. Unix에서는 시스템의 서비스를 중단하기 위해 다운시킬 때 이러한 signal을 프로세스에게 보내며 이 signal은 kill 명령어에서의 기본 signal입니다.
SIGCHLD 자식 프로세스가 수행을 정지하거나 종료하였을 때 발생하는 signal입니다. 
이 signal은 기본적으로 무시됩니다.
SIGSEGV 보통 유효하지 않은 메모리 위치에 read나 write를 시도할 때 발생하거나 운영체제 영역에 메모리를 덮어씌울려고 할 때 발생합니다.
SIGSTOP 실행을 정지시키며 해당 명령은 포착할 수 없고 무시할 수 없습니다. 하지만 프로세스가 정지되어 있는 상태라면 무시됩니다.
SIGCONT 정지된 실행을 재개합니다.
SIGTSTP ctrl + z 를 입력하였을 때 터미널에서 발생하는 정지 signal입니다.

 

 signal은 생성, 포착, 무시 될 수 있습니다.

 

 위 signal들을 포착하여 제어하기 위해 signal(int signum, void  (*handler) (int))이라는 함수를 사용합니다.

 해당 singal 함수를 통해 비동기적 signal 처리가 가능합니다.

 

signal
(
     int signum : 제어하고자 하는 signal 번호 ( ex. SIGINT 입력)
     void (*handler)(int) : 첫번째 paramerter로 받은 signal 이 발생했을 경우 실행할 함수
)

 

signal parameter로 handler대신에 SIG_IGN, SIG_DFL를 넣을 수 있습니다.

SIG_IGN : signal 무시

SIG_DFL : signal의 default action을 실행

 

* SIG_IGN는 무시할 수 없는 signal에서는 사용할 수 없습니다. (ex. SIGKILL)

* SIG_DFL이 사용되는 경우는 부모 자식간에 signal 제어가 달라야 할때, 혹은 중간에 signal을 default action으로 변경할 필요가 있을 때 사용됩니다.

  >TMI. fork를 통해 부모가 자식 프로세스를 생성할 때, 부모의 모형 그대로 가져오는 거기 때문에 signal 처리도 같아집니다.