원래 pintOS에서 fork는 구현하지 않는데, kaist pintOS에서는 fork() 함수를 구현한다.
공식 깃북에는 아래와 같이 설명이 돼있다.
요약하자면, 현재 프로세스의 복제 프로세스를 만든다.
1. 현재 스레드의 interrupt_frame을 복제한다.
2. fd_table을 복제한다.
3. 복제된 스레드는 tid = 0을 갖는다.(부모는 정상적으로 tid 할당)
4. 제대로 복제하지 못할 경우 TID_ERROR (==-1)을 리턴한다.
fork() 함수를 활용해, 복제한 프로세스(스레드)로 특정 작업을 진행할 수 있다.
흐름은 아래 그림을 참고하자.
부모 프로세스와 자식 프로세스의 상황
syscall.c에서 구현한 fork() 함수
pid_t fork (const char *thread_name){
struct intr_frame *user_tf = &thread_current()->fork_tf;
pid_t child_pid = process_fork(thread_name, user_tf);
sema_down(&get_child_process(child_pid)->load_lock);
return child_pid;
}