Introduction

What is fork()?

fork 這個 system call 會創造一個和 parent process 完全相同的複製體並且擁有自己的 PCB 及 virtual memory

Function Prototype

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void)

Example

if ((pid = fork()) < 0) {
	err_sys("fork error");
}
else if (pid == 0) {
	... // child process
}
else {
	... // parent process
}

Detail

Feature

  • 除了 boot program 以外唯一創造新 process 的方法
  • 回傳值,我們可以依此來分辨 parent process 和 child process
    • 如果是 parent process,則回傳 child pid
    • 如果是 child process,則回傳 0
  • 我們沒辦法知道 parent 還是 child process 會先跑(這是 CPU scheduling 決定的)
  • PCB 和 virtual memory 都是複製而非共用(除了 text segment,因為 program 的程式碼不變)
  • 使用 Copy-on-Write (CoW) 節省記憶體

File Sharing

因為 fork 複製了 file descriptor table,所以他們連到了相同的 open file table objects

Inheritance

parent 和 child process 的多數的特性都是被繼承的,而沒被繼承的有

  • return value of fork()
  • process id
  • parent id
  • cpu time
  • file locks (因為跟著 process)

Why fork()

  • 讓不同 process 去跑程式碼的不同部分
  • 想要跑不同的 program (用 exec() 改 virtual memory 的 text segment 部分)

vfork

  • 大部分地方和 fork 相同,但和 parent process 共享 virtual memory
  • child process 在跑的時候會 suspend parent process