2010-09-29 240 views
0

對大多數人來說,看起來可能是幼稚的,但我無法理解這段小小的代碼。爲什麼輸出打印兩次?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
int main(int argc, char** argv) { 
    int i, pid; 
    pid = fork(); 
    printf("Forking the pid: %d\n",pid); 
    for(i =0; i<5; i++) 
     printf("%d %d\n", i,getpid()); 
    if(pid) 
     wait(NULL); 
    return (0); 
} 

停止把這個程序的是

Forking the pid: 2223 
0 2221 
1 2221 
2 2221 
3 2221 
4 2221 
Forking the pid: 0 
0 2223 
1 2223 
2 2223 
3 2223 
4 2223 
Press [Enter] to close the terminal ... 

在for循環printf命令被使用一次。爲什麼「分叉pid」,然後再打印兩次pid。這是如何工作的?有人可以解釋我嗎?提前致謝。 有人可以解釋我爲什麼要在這裏等待嗎?我從手冊頁中瞭解到的是等待將控制權轉回到父進程?我所理解的是正確的嗎?分流後是否需要等待? 操作系統:ubuntu,編譯器:gcc,IDE:netbeans

+1

呃......但那正是叉子的功能!你分叉了這個過程以及fork完成兩次後的所有事情,因爲現在你有兩個*進程!你基本上是問爲什麼'叉'叉! – AnT 2010-09-29 14:48:37

+0

[此C代碼可以做什麼?]可能的重複(http://stackoverflow.com/questions/3730429/what-does-this-c-code-do) – 2010-09-29 14:49:52

+0

它不是任何其他問題的重複,但可能是您提供的鏈接將幫助我進一步瞭解分叉。 – narayanpatra 2010-09-29 15:12:59

回答

3

但這正是fork所做的。您分叉進程和fork兩次之後的所有內容,因爲現在您有兩個進程執行相同的打印代碼。你基本上是問爲什麼fork叉。 fork叉因爲是應該分叉。這就是它的目的。

fork之後,父進程和子進程通常並行執行,這意味着您在示例中看到的很好的順序輸出無法保證。您可能很容易以兩個進程的行交錯輸出結束。

wait函數在你的情況下只能從父進程執行。它使其等待,直到子進程終止,並且只有在父進程也繼續終止之後。在這個特殊的例子中調用wait並不重要,因爲程序在此之後什麼都不做,它只是終止。但是,例如,如果您想從子進程收到一些反饋到父進程中,並在父進程中針對該反饋做了一些額外的工作,則必須使用wait來等待子進程完成其執行。

+0

感謝哥們。我知道了。 – narayanpatra 2010-09-29 14:53:37

1

您正在兩個進程中打印。把你的打印循環中if (pid)else條款:

pid = fork(); 
if(pid) 
{ 
    printf("Child pid: %d\n",pid); 
    wait(NULL); 
} 
else 
{ 
    for(i =0; i<5; i++) 
     printf("%d %d\n", i,getpid()); 
} 

你看,fork返回兩次,一次在父進程,一旦在子進程。它在子項中返回0,並在父項中返回創建的進程的PID。

+0

對不起,我無法理解。你能詳細說明嗎? – narayanpatra 2010-09-29 14:49:28

+0

謝謝,它有幫助。 – narayanpatra 2010-09-29 14:57:44

0

fork創建一個新進程,並在舊進程(父進程)和新進程(子進程)中都返回。

您可以通過查看fork的返回值來判斷您處於哪個位置。在父進程中,它返回子進程的PID。在子進程中,它返回0

3

fork()調用會產生一個新進程。然後從兩個進程中的每一個執行其餘代碼。 (Man page)