2017-03-06 51 views
0

系統調用fork()會爲地址空間創建兩個完全相同的副本,一個用於父項,另一個用於子項。在fork中檢測子進程創建()

在使用if語句使用fork時,在下面的代碼中將創建子進程多少次?

fork(); 
pid=fork(); 
if(pid==0) 
{ 
fork(); 
} 
+0

五次。你需要進一步的解釋嗎? – Beta

+0

「使兩個相同的地址空間副本」 - 不,它不。它使一個已經存在的地址空間完全相同。在大多數現代實現中,它甚至沒有這樣做 - 它只是創建一個新的地址空間,它引用與原始頁面相同的所有頁面,但將它們標記爲寫入時複製。 – twalberg

回答

0

添加一些額外的代碼來獲得這樣的:

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

int main() 
{ 
    pid_t pid; 
    pid = fork(); 
    if (pid != 0) printf("%d\n", pid); 
    pid = fork(); 
    if (pid != 0) printf("%d\n", pid); 
    if(pid==0) 
    { 
     pid = fork(); 
     if (pid != 0) printf("%d\n", pid); 
    } 
    return 0; 
} 

然後編譯,執行,檢查其輸出:5子進程的ID