Signal(1)

이리·2023년 5월 23일
0

System Programming

목록 보기
2/3
post-custom-banner

Signal 이란?

일상에서 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 Handling

일단 시그널이 전달되면, 시그널을 처리하는 Signal Handler 가 실행된다. 일반적으로 프로세서에서 Signal Handler 를 따로 정의하는 경우가 드물기 때문에, 보통 signal마다 존재하는 default handler가 실행되게 된다. 사실 Signal이라는 것이 보통 error가 발생했을때 나타나는 것으로 대부분이 Kernel 단계에서 처리하게된다. 따라서 Signal Handler는 default로 실행되는 경우가 많다고 본다.

  • signal 이 처리되지 않은 handler를 "a pending signal" 이라 한다.
  • signal handling 또한 유저에 의해 blocking 될 수 있다.

Signal Handler 수행 방식

  1. Default handler 수행 (SIG_DFL)
    보통 error가 발생했을때 시행되며, kernel에 의해 제공받는 handler이다.
    프로그램이 종료되거나 error 메시지를 반환하고 종료된다.
  2. signal 무시 ( SIG_IGN)
    시그널이 무시된다. 하지만 모든 시그널이 무시되는 것은 아니고 SIGKILL, SIGSTOP의 경우 무시될 수 없다.
  3. 유저가 정의한 handler 수행
    유저가 정의한 handler를 수행한다. 유저정의 handler의 경우 일회용이라 한번 사용하면 다시 정의해서 사용해야한다.

Signal 종류

signal 의 종류가 워낙 많기에 주요한 signal만 정리해보자

Signal NameReason of a signalValueDefault Handler
SIGABRTProgram abort ( abort ( ) )6Core-dump & exitabort 발생시 호출
SIGALRMTimer alarm14Exit타이머 발생
SIGCHLDDeath of a child process17Ignorechild 프로세서가 종료되거나 exit 됐을 경우 발생
SIGCONTContinue a stopped process18Restart / Ignore프로그램 계속 실행
SIGILLNot an instruction14Exit명령어를 수행하지 못할 경우
SIGINT^C2Exit^C 눌렀을때
SIGKILLimmediate kill request9Exit프로그램 즉시 종료
SIGIPIPEwrite attempt with no reader13Exit권한 없는데 쓰려고 할때
SIGEGVillegal memory access11Core-dump & Exit비정상적 메모리 접근
SIGSTOPStop19Stop프로세스 멈췄을때
SIGUSR1User defined signal 110Exit(Default)유저 정의 handler
SIGUSR2User defined signal 212Exit(Default)유저 정의 handler

Signal 함수

signal(signal number, handler 함수)

처리할 Signal handler 함수를 정의하는 함수 ( signal을 보내는게 아님을 주의하자 ! )

  • signal handler 함수는 미리 정의가 되어있어야한다.

정상적으로 처리됐을 경우 기존의 handler 함수의 주소가 반환되고, 그러지 않을경우 SIG_ERR이 반환된다.

signal handler는 오직 한번만 사용할 수 있다.
한번 사용된 이후 default handler 가 실행된다.

kill( signal 보낼 pid , signal number )

!! kill 함수의 경우 프로세스를 죽이는 것같이 생겼지만.. 시그널을 보내주는 함수이다.

정상적으로 처리됐을 경우 0이 반환되고, 그러지 않을경우 -1이 반환된다.

pid 의 경우 0보다 클 경우 pid 프로세서, 0 일 경우 group 내의 모든 프로세서, -1 일 경우 init을 제외한 모든 프로세서를 의미한다.

raise( signal number)

signal을 자신에게 전달하는 함수이다.

정상적으로 처리됐을 경우 0이 반환되고, 그러지 않을경우 -1이 반환된다.

alarm( 초단위 숫자 )

매개변수로 전달되는 초 이후 SIGALRM을 자신에게 보낸다.
기존에 alarm 함수가 있을 경우 대체가 되고, alarm(0)이 실행될 경우 모든 알람이 해제된다.

abort( )

SIGABRT 를 발생시킨다. >> core dump and exit

pause( )

어떠한 signal이 올때까지 기다린다.
default handler가 사용되었을 경우 프로세스가 종료되고, 유저 정의 handler가 사용됐을 경우 signal 발생 이후로 되돌아간다.

post-custom-banner

0개의 댓글