인자로 들어온 pid 를 기다리는 시스템 콜.

아직 pid가 종료되지 않은 상태라면 종료될때까지 기다린다. 프로세스가 exit 함수를 실행하며 종료된 경우에는 wait 함수는 이 exit 함수로 전달된 상태값을 반환해야 한다. 반면 커널에 의해 종료된 경우 wait 함수는 -1을 반환해야 한다.

wait이 -1을 반환해야하는 경우는 아래와 같다.

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을 반환한다.