fork() 建立新進程的原進程fork() 建立的新進程,獲得父進程資源副本 (程式碼、資料、檔案描述符等)| 進程 | fork() 返回值 | 執行分支 |
|---|---|---|
| 父進程 | 子進程 PID (>0) | if (pid > 0) |
| 子進程 | 0 | else if (pid == 0) |
| 失敗 | -1 | else |
pid_t pid = fork();
sleep(5); // 方便觀察 ps 輸出
if (pid > 0)
printf("PID: %d -> Father Process\n", getpid());
else if (pid == 0)
printf("PID: %d -> Son Process\n", getpid());
else
printf("Create failed\n");
$ ps x
PID TTY STAT TIME COMMAND
3212 pts/3 S+ 0:00 ./s # 父進程
3213 pts/3 S+ 0:00 ./s # 子進程 (相同程式碼,不同 PID)
因為 fork() 在父子進程中返回不同值,導致進入不同 if/else 分支。父進程獲得子進程 PID,子進程獲得 0。這是 fork() 設計的核心精華:「一次呼叫,兩次返回」。
子進程複製父進程的虛擬記憶體空間 (Copy-on-Write 優化) 檔案描述符表共享 (指向同一檔案表項) 信號處理、環境變數、工作目錄等均被繼承