몇 가지 문제점
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. 먹은 횟수 초과 시
먹은 횟수가 초과했는데도, 시간이 초과된 것으로 판단하고 답이 없음.
이유 : 포크를 반환하지 않았기 때문. 먹는 횟수를 초과했을 때는 포크를 내려놓고 죽어야 함.