Process

fork 系統呼叫是如何工作的?

  • March 13, 2022

如果我們看這個例子

#include <stdio.h>
#include <unistd.h>

void main(){
 int pi_d ;
 int pid ;
 pi_d = fork();
 if(pi_d == 0){
   printf("Child Process B:\npid :%d\nppid:%d\n",getpid(),getppid());
 }
 if(pi_d > 0){
   pid = fork();
   if(pid > 0){
     printf("\nParent Process:\npid:%d\nppid :%d\n",getpid(),getppid());
   }
   else if(pid == 0){
     printf("Child Process A:\npid :%d\nppid:%d\n",getpid(),getppid());
   }
 }
}

對我來說,這看起來會無限期地創建程序,因為當我們分叉一個程序時,會創建一個父程序的副本。所以程式碼被複製了。

這意味著每個新程序都執行相同的程式碼;因此,它呼叫pi_d = fork(),依此類推。

我在這裡缺少什麼?

引用POSIX fork 定義(我的粗體強調):

返回值

成功完成後,fork() 將向子程序返回 0,並將子程序的程序 ID 返回給父程序。兩個程序都應從函式中****繼續執行fork()。否則,-1 應返回父程序,不創建子程序,並errno設置為指示錯誤。

OP寫道:

這意味著,對於每個新程序,它執行相同的程式碼

成功完成fork()並從它返回後,父和子立即恢復fork(): none 將再次執行第一個fork(),然後 none 將再次執行第一個或第二個fork(),因為此程式碼中沒有循環允許這種情況發生。

假設沒有發生錯誤(不檢查):

  • 父叉

    • 如果是子顯示Child Process B

    • 否則,如果是父級,請再次分叉

      • 如果它(再次)是父母,則顯示Parent Process
      • 如果是父母的第二個孩子,則顯示Child Process A

由於沒有保證哪個孩子或父母會以確切的執行順序擊敗另一個的順序,3 個輸出可以以任何順序發生或混合(但在給定的特定作業系統上,一個顯示順序應該比其他顯示順序更頻繁地發生,並且Child Process B具有可能會首先顯示一個領先的開始)。

引用自:https://unix.stackexchange.com/questions/694180