열렬히.뛰기

여러가지 고비

école 42 > philosopher > philosopher : 보너스 > 여러가지 고비

몇 가지 문제점

1. 시간이 이상하게 찍힘

죽는 조건을 이상하게 줬기 때문.

c
// 올바른 예시
if (cur_time - tools->last_eat >= tools->time_to_die)
{
		philo_print(tools, tools->philo_id, "is died");
		exit(1);
}

이때 last_eat은 먹으면서 매번 찍어야 함.

2. 특정 상황에서 출력 안됨

첫 번째 make 후 : 정상적으로 출력됨

실행 후 ctrl + c 를 누르고 실행 : 전혀 나오지 않음.

이유 : 죽는 조건과 연결이 되어 있었음.

c
int	philo_parent(t_box *tools)
{
	int	i;
	int	count;
	int	exit_code;
	int	status;

	i = 0;
	count = 0;
	while (i < tools->total_philo)
	{
		waitpid(-1, &status, 0);
		exit_code = WEXITSTATUS(status);
		if (exit_code != 0)
			return (philo_kill(tools, exit_code));
		i++;
	}
	return (0);
}

int	philo_kill(t_box *tools, int exit_code)
{
	int	i;

	i = 0;
	while (i < tools->total_philo)
		kill(tools->pid_box[i++], SIGKILL);
	if (exit_code == -1)
		printf("sem fail\n");
	return (0);
}
  • 각 프로세스를 회수하는 함수들이다.
  • 보면 알겠지만, while()을 두번 연속으로 씌우는 구조
    • while(1)이 아닌 이유 : 회수해야 하는 프로세스의 갯수는 한정적이기 때문
    • 특정상황에서는 while()에서 탈출해야 함.
    • WEXITSTATUS를 이용해 exit_code를 얻고,
      • 만약 exit_code가 0이 아니면 시간 초과로 죽은 것으로 판단
      • 0이면 먹는 횟수 초과로 죽은 것으로 판단
  • 이 방식이 아니라 다른 방식을 취하면 프로세스의 회수가 제대로 되지 않음.
  • 출력이 꼬이거나, 다음 출력이 엉망으로 나오거나 할 수 있음.

3. 먹은 횟수 초과 시

먹은 횟수가 초과했는데도, 시간이 초과된 것으로 판단하고 답이 없음.

이유 : 포크를 반환하지 않았기 때문. 먹는 횟수를 초과했을 때는 포크를 내려놓고 죽어야 함.