為什麼 fork 有時會回傳父級,有時會回傳子級?

為什麼 fork 有時會回傳父級,有時會回傳子級?

當執行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 */
}

....或類似的。

相關內容