Signal이란 뭘까
Signal은 소프트웨어 interrupt로 프로세스에게 뭔가 발생했다는것을 알려주는 간단한 메시지를 "비동기"적으로 보내는 것이다.
#include <signal.h>
int sigaction (int signum, const struct sigaction *act, struct sigaction *oldact);
// signum = 시그널 번호 (SIGINT, SIG_IGN, ...)
// act = 설치할 시그널 핸들러
// oldact = 새 핸들러 설치전 시그널 핸들러 백업 (불필요시 NULL)
Signal handler란 무엇인가?
시그널 처리를 위해 지정하는 함수 - 시그널을 받았을때 해당 함수를 호출한다.
s_sigaction.__sigaction_u.__sa_sigaction = &sig_handler;
s_sigaction.sa_flags = SA_SIGINFO;
main 문에서 실행될때를 가정할때 manual에서는
__sigaction_u.__sa_sigaction은 sa_sigaction로 define된다
다시 말해 위 코드는 각각 sig_handler라는 함수를 sigaction으로 지정해주고
sa_flags를 SA_SIGINFO로 지정해주는 역할을 한다.
이유는 sa_handler와 sa_sigaction은 메모리가 중첩되고,
sa_flags에 SA_SIGINFO가 설정 되어 있지 않으면 sa_handler에는 시그널을 처리할 동작을 지정하고,
설정되어 있으면 sa_sigaction 멤버를 사용하기 때문에 위 코드에서는 SA_SIGINFO를 설정해두었고
sa_sigaction 멤버를 사용하는 것이다.
(정리하자면 핸들러가 하나가 아닌 3개의 인자를 취할때
sa_handler대신 sa_sigaction의 siginfo_t 구조체를 이용하기 위해 사용하는 플래그이다)
sigaction(SIGUSR1, &s_sigaction, NULL);
SIGUSR1 = 사용자 정의 시그널, kill을 통해서 Signal 전달