signal() 사용해 SIGUSR1 signal 주고받기

J_JEON·2022년 6월 29일
1

클라이언트가 서버로 문자열을 전송하면 서버에서 해당 문자열을 출력하도록 하는 프로그램을 만들어보는 프로젝트
UNIX의 signal을 활용하여 제작

서버

int	main(void)
{
	int	pid;

	pid = getpid(); //서버의 pid를 출력하기위해 프로세스의 pid를 알아냄
	printf("pid : %d\n", pid); // pid를 출력
	signal(SIGUSR1, sig_handler_usr1); 
    // SIGUSR1 시그널이 들어오면 sig_habdler_usr1 함수를 실행해줌
	while (1) // sleep을 반복하여 프로세스가 종료되지않게 해줌
		sleep(1);
	return (0);
}

클라이언트

int	main(int argc, char **argv)
{
	if (argc != 2) //서버의 pid를 받아서 시작해야하기때문
		return (0);
	kill(ft_atoi(argv[1]), SIGUSR1); 
    // kill함수 사용해 받아온 pid로 SIGUSR1 시그널을 전송
	return (0);
}

signal(int signal,void (*)(int))

특정한 시그널을 수신하면 정해진 함수를 실행해주는 함수

  • signal(SIGUSR1, sig_usr1);
    SIGUSR1 시그널을 수신하게되면 sig_usr1함수를 실행

kill(pid_t pid, int sig)

pid는 시그널을 받을 특정 프로세스 또는 그룹의 pid

  • pid > 0
    pid에 대응되는 프로세스에 시그널을 보낸다.
  • pid == 0
    현재프로세스에 속한 모든 그룹의 프로세스에 시그널을 보낸다.
  • pid == -1
    1번 프로세스 (init) 를 제외한 모든 프로세스에 시그널을 보낸다.
  • pid < -1
    프로세스 그룹에서 절대값으로 동일한 모든 프로세스에게 시그널을 보낸다. 

 어떤 프로세스도 명시된 pid와 일치하지 않으면 kill()은 실패하고 errno를 ESRCH(프로세스없음)로 설정한다.
프로세스가 요청된 PID에 시그널을 보낼 권한이 없는 경우 kill()은 실패하고, errno는 EPERM으로 설정한다.

profile
늅늅

0개의 댓글