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를 두번째 인자로 주면? 어떻게 될까?

 

정답을 알겠다면 제대로 이해 한것이다.