42cursus
[minitalk] SIGUSR1 예제
todoni
2022. 3. 13. 17:33
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
struct sigaction act_sigusr1;
struct sigaction act_sigusr1_prev;
void sigusr1_handler(int signo)
{
printf("sigusr1 signal\n");
//sigaction(SIGUSR1, &act_sigusr1, NULL);
}
int main( void)
{
pid_t pid;
pid = getpid();
act_sigusr1.sa_handler = sigusr1_handler;
sigemptyset(&act_sigusr1.sa_mask);
sigaction(SIGUSR1, &act_sigusr1, &act_sigusr1_prev);
printf("pid: %d\n", pid);
kill(pid, SIGUSR1);
kill(pid, SIGUSR1);
printf("bye\n");
return (0);
}
SIGUSR1, SIGUSR2 는 사용자 정의 시그널이다.
그럼 사용자 정의 시그널은 어떻게 발생 시킬까?
알아서 발생 시킬 수 없다.
대신 프로그램적으로 명시적으로 시그널을 보낼 수 있다.
어떻게? kill 이라는 함수로.
터미널에서 프로세스 종료 시킨다고 한번 씩은 다들 써봤을 것이다.
kill이라는 함수는 이름이 kill이지만 사실 정말로 kill만 하는 함수는 아니다.
엄밀히는 kill이 아니라 send_signal이 더 맞는 이름이다.
kill(pid, signo) 는
프로세스 id가 pid인 프로세스에게 signo인 시그널을 보내라는 말이다.
getpid 함수는 getpid()를 호출한 프로세스의 pid를 반환해준다.
그래서 실행 결과는 이렇다.
여기서 sigusr1_handler 함수의 주석을 해제하면 어떻게 될까?
아무일도 없다. ㅋㅋ
그럼 세번째 인자를 NULL 말고 act_sigusr1_prev로 바꾸면?
아니면 act_sigusr1_prev를 두번째 인자로 주면? 어떻게 될까?
정답을 알겠다면 제대로 이해 한것이다.