2014-10-18 29 views
2

我有這個程序(UNIX)fork()如何在循環中工作?

childpid = 0; 
int i, n; 

for(i=1; i < n; i++) 
    if((childpid = fork()) 
     break; 
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n, 
     i, (long)getpid(), (long)getppid(), (long)childpid); 
return 0; 

它說,因爲父進程的childpid變量沒有一個0值,它會跳出一個循環。子進程的PID爲0,並且在下一次迭代中將成爲父進程。

據我所知,在調用fork fork()之後,將使用代碼創建一個新進程。如果一個父進程由於它的childpid不是0而跳出循環,那麼這是不是意味着printf語句將會運行一次,並且程序將在循環結束後終止? 我很困惑這個程序如何運行。

我也有這個代碼

for(i=1; i < n; i++) 
    if(((childpid = fork()) <= 0) 
     break; 
fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n, 
     i, (long)getpid(), (long)getppid(), (long)childpid); 
return 0; 

這產生的處理的風扇並執行所述第一程序的相反。子進程由於其chilpid等於0而突破循環,並且父進程在循環中運行。

我在週一的考試,我已經明白一切 請你幫助:如果存在/

回答

1

這是否意味着printf語句將會運行一次,並且程序會在循環結束後終止?

是的。但在它沒有產生一個兒童進程繼續其遺產之前。

下面是一個很糟糕的圖表。在代碼片段#1中,過程分叉自己,父母死亡,然後孩子繼續前進。

在代碼片段#2中,進程分叉自己,孩子死亡,父母繼續前進。

在每種情況下,結果都是很長的打印語句序列。

Crappy diagram showing process trees in each case

+0

你竟然爲一個陌生人畫了一個完整的圖表?哇,我真的很感激。這是很多的幫助,我現在完全理解現在發生了什麼 因此,在代碼實際上中斷之前,一個孩子創建與pid零,繼續循環,成爲父母,創建另一個孩子和父母休息 明白了! – user3240534 2014-10-20 07:21:07

+0

@ user3240534如果回答了您的問題,您可以點擊旁邊的勾號將其標記爲已接受。 – 2014-10-20 21:40:56

0

我編輯你的第一個代碼位,並增加了「{}」開頭和結尾聲明和for循環:

**int main() 
{ 
int childpid = 0; 
int i, n; 
n=5; 
for(i=1; i < n; i++){ 
    if((childpid == fork())) 
    { 
     break; 
    } 
     fprintf(stderr, "i:%d process ID: %ld parent ID: %ld child ID: %ld\n", 
     i, (long)getpid(), (long)getppid(), (long)childpid); 
    } 
wait(0); 
return 0; 
}** 

這是結果:

我:1進程ID:3443父ID:2790子ID:0

I:2進程ID:3443父ID:2790子ID:0

I:3進程ID:3443父ID:2790子ID:0

I:4進程ID:3443的父編號:2790子編號:0

會發生什麼情況是主進程(父進程)執行for循環中的所有輸出,而每個子進程在if語句之後立即退出。

雖然關於你的第二個代碼,而不是

如果(((childpid =叉())< = 0) 突破;

你可以寫:

int f=fork(); 
if (f<0) 
{ 
    perror("can't create child\n"); 
} 

if(f==0) 
{ 
    break; 
} 

因爲如果「f」小於0,這意味着孩子沒有成功創建,如果是的話,它會發生imediatley。

+0

實際上,你重新寫的代碼,以幫助..哇 我真的很感激它,它回答我的問題。 – user3240534 2014-10-20 07:20:35

+0

太棒了!我很高興我能幫到你 – balinteu 2014-10-21 16:21:32