2012-07-02 34 views
0

就是孩子,叉後,從一開始還是從家長是地方啓動程序?叉:哪裏的孩子開始運行?

例如,它這個程序中,在子從第1行或第3行開始?

int i=1 
fork() 
i=i*2 
fork 
i=i*2 
+1

子進程和父進程幾乎分叉後的相同,這意味着這兩個孩子和家長將繼續從行執行後叉'()'。 – nhahtdh

+0

這個問題是用極低的質量制定的。請問我們什麼時候請多考慮10秒。 –

+1

因此,不是花時間寫完這個問題,而是沒有做出基本的printf()調試來解決這個問題?這裏是代碼:int main(void){printf(「starting \ n」); switch(fork()){case 0:printf(「分叉進程\ n」);打破;默認:printf(「父進程\ n」); break;} exit(0); } – tbert

回答

0

叉從管線3,叉發生的位置處開始。

6

fork()通過複製調用進程來創建一個新進程。從fork(2)

爲[...]

: 新工藝,被稱爲孩子,是 一個確切的重複調用的過程中,被稱爲父,除了 以下幾點它是完全重複的,它也會有相同的指令指針和堆棧。所以孩子會調用fork()之後。現在,您可能會問,我如何確定當前的計劃是孩子還是父母?查看返回值的手冊頁:

成功時,子進程的PID返回父, 和0的孩子返回。如果失敗,則返回-1在 父,沒有創建子進程,並errno設置爲合適。

所以如果fork()結果等於0,你在孩子過程中,如果其大於0你的父母是,如果它的下面0你就麻煩了。

請注意,這意味着,每一個代碼是獨立的fork()結果值,將在的孩子和家長被執行。所以,如果你是例如創建與16級的進程池中,你應該做的:

for (int i = 0; i < 16; i++) { 
    pid_t pid = fork() 
    if (pid == 0) { 
     do_some_work(); 
     exit(0); 
    } else if (pid < 0) { 
     // fork failed 
     do_some_error_handling(); 
    } 
} 

如果你錯過了exit(0),你會產卵2 16-1處理(在那裏,只是用100代替16沒有樂趣。)

0

當叉的回報,它在這兩個父(返回子進程的PID)和(返回0)的孩子返回。執行繼續從父母和孩子那裏。

這樣,典型的使用叉的是這樣的:

if (0 == (child = fork())) 
    // continue as child. 
else 
    // Continue as parent. 
0

Child將在第2行,即,fork()被創建但它將從線3即i = i*2開始執行。這裏讓我困惑的是你的路線4.你想在那裏做什麼?

+0

我想他正在嘗試在第4行再次fork(),他可能已經忘記了這個制動器。 – doniyor

+2

C :-)這是一個錯誤 – Abhineet

+1

是的,大錯! :d – doniyor