
當執行fork
建立新進程的呼叫時,如果成功,它將返回0
(子進程)或父進程。
我不明白這背後的想法。為什麼不fork
總是返回child
或總是parent
?
答案1
當您執行 時fork()
,正在執行的程式碼會發現自己在兩個進程中執行(假設分叉成功):一個進程是父進程,另一個是子進程。fork()
在子進程中傳回 0,在父進程中回傳子 pid:它完全是確定性的。
這是您可以在 後確定fork()
您是在父級還是子級中運行的方法。 (以及父進程如何知道子進程 pid——它需要在某個時刻等待它。)
更詳細一點:
- 未來的父進程呼叫
fork()
; - 核心創建一個新進程,即子進程,並適當地設定各種內容 - 但兩個進程都在運行相同的程式碼並「等待」同一函數的返回;
- 兩個進程都繼續運行(不一定立即,也不一定同時,但這不是重點):
fork()
返回 0 給子進程,子進程繼續並使用該資訊來確定它是子進程;fork()
將子進程 pid 傳回給父進程,父進程繼續並使用該資訊來確定它是父進程。
答案2
系統fork()
呼叫總是「返回兩次」(除非失敗)。在父進程中,它會傳回子進程的 PID,在子進程中,它會傳回零。
通常的流程是
pid_t pid;
int status;
pid = fork();
if (pid == 0) {
run_child_stuff();
exit(0);
} else if (pid > 0) {
run_parent_stuff();
wait(&status); /* wait for child to exit */
} else {
/* handle failure to fork */
}
....或類似的。