인자로 들어온 pid 를 기다리는 시스템 콜.
아직 pid가 종료되지 않은 상태라면 종료될때까지 기다린다. 프로세스가 exit 함수를 실행하며 종료된 경우에는 wait 함수는 이 exit 함수로 전달된 상태값을 반환해야 한다. 반면 커널에 의해 종료된 경우 wait 함수는 -1을 반환해야 한다.
wait이 -1을 반환해야하는 경우는 아래와 같다.
fork()
호출 후 성공적으로 반환 받은 pid
를 의미 !wait
를 호출한 프로세스가 이미 pid
에 대해 기다리는 wait
를 호출한 경우
: 한 프로세스는 어떤 주어진 자식에 대해서 최대 한번만 wait
할 수 있기 때문wait이 호출되면 시스템콜 핸들러에 의해 syscall_wait 이 실행된다.
int syscall_wait(struct intr_frame *f)
{
int return_value;
int pid = f->R.rdi;
struct child_info *child_info = search_children_list(pid);
if (child_info == NULL)
{
f->R.rax = -1;
return -1;
}
if (child_info->exit_code == EXIT_CODE_DEFAULT)
{
return_value = process_wait(pid);
f->R.rax = return_value;
}
else
{
return_value = child_info->exit_code;
f->R.rax = return_value;
}
list_remove(&child_info->elem);
free(child_info);
return return_value;
}
한 줄씩 뜯어보자.
wait 함수는 인자로 받은 pid가 자신의 자식일 때만 유효하다. 따라서 인자로 받은 pid가 내 자식 리스트에 있는지 확인해야 한다.
struct child_info *child_info = search_children_list(pid);
search_children_list 함수는 현재 스레드의 자식 리스트에 pid 와 일치하는 child_info를 찾아서 반환한다.
if (child_info == NULL)
{
f->R.rax = -1;
return -1;
}
만약 찾지 못한다면 (= pid가 현재 스레드의 자식이 아니라는 것) -1을 반환한다.