2015-07-02 18 views
0

我在這個程序中遇到了一些麻煩。我知道什麼是fork()函數。它用於從現有流程創建新流程。新進程稱爲子進程,現有進程稱爲父進程。父母返回孩子的PID,孩子返回0.這就是說,我很難理解這個程序中兩個分叉函數的作用。fork()函數如何在此程序中工作?

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

int main() 
{ 
    int i,y,x=1; 
    for (i=0;i<4;i++) 
     if(x && fork()) 
     { 
      y = i; 
      x = 0; 
     } 
    if (x) y = i; 
    fork(); 
    printf("%i\n",y); 
} 
+2

程序沒有意義。 – hek2mgl

+0

這裏是輸出https://ideone.com/Q9oD7o –

+0

雖然程序起作用,但它仍然沒有多大意義。 – ikrabbe

回答

0

原始進程打開一個進程,當它進入循環的if。自fork() == 0以來,該孩子沒有輸入if。現在母公司有x == 0,並且不再輸入以下迭代'if(短路&&阻止fork s)。

注:短路因爲x == 0 =>不需要分叉兩次評估fork()(真該叉形一旦所有過程)if(x && fork())防止。分叉一次的進程永遠不會進入循環的if,因爲x == 0從那時起。

你得到的是每個循環值的兩倍,因爲每個新進程都會在迭代之前分叉一次,並在打印之前的循環之外。對於循環中的每個衍生進程,除第一個之外沒有其他分支。

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

int main() 
{ 
    int i,y,x=1; 
    for (i=0;i<4;i++) 
     if(x && fork()) // only un-forked process (x=1) executes fork() 
     { 
      // only parent process (fork() != 0) execute this 
      y = i; 
      x = 0; 
     } 
    if (x) y = i; // set up i=4 for last forked process (has x=1) 
    fork(); 
    printf("%i\n",y); 
} 

過程產卵過程將是這個樣子:

Forking a process and right before the last print

提示:在調查這樣的代碼,你可以添加輸出語句(printf)或使用調試器。

+0

使用調試器和許多子進程比在紙上寫下更難,這裏會發生什麼。 – ikrabbe

+0

我不確定,使用條件斷點你可以看到每個線程正在做什麼。取決於你有多好紙張(我不是)。 –

+1

@ReutSharabani:我認爲你錯了,父進程只會在循環中打開一個孩子,因爲fork()會返回一個非零值,視爲true。 –

1

首先斷言:fork不會失敗。這是不正確的,但更簡單的

如果(X & &叉()) - >是真實的,如果x == 1,如果叉換取父親 那麼假。 所以孩子也會創造一個孩子(除了最後一個孩子),但父親只是創建一個孩子。

循環後你有1 + 4新過程。 這5個processus做最後一個fork(),你有10個進程。

由於任務的調度,輸出結果不確定。

+0

這只是非確定性輸出的順序。結果總是相同的:區間[0,4]中的每個數字都打印兩次。每次來自不同的過程。 – ikrabbe

0

其實你可以從這項計劃中學習的東西,當你看的PID叉回來,估計從,這叉生成的輸出結果:

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

int main() 
{ 
    int i,y,x=1; 
    pid_t p,c; 
    for (i=0;i<4;i++) 
     if(x && 0 != (p=fork())) 
     { 
      y = i; 
      c = p; 
      x = 0; 
     } 
    if (x) y = i; 
    p=fork(); 
    printf("%i %d %d\n",y, p, c); 
} 

比如我得到這樣的輸出:

0 24413 24412 
0 0 24412 
2 24417 24416 
1 24415 24414 
1 0 24414 
3 24419 24418 
2 0 24416 
3 0 24418 
4 24420 0 
4 0 0 

第一行是第一個孩子的孩子,下一行是第一個孩子本身等等。最後一行是父母。

想一想,你可以學習fork如何工作。

Err,對不起,我完全錯了,差不多:fork返回一個正面的pid給父母,當然不會給孩子。因此,每一個有正p和c的行都是父類,等等。我留下其餘的人找你。