2017-02-17 56 views
1

我正在學習操作系統考試,現在我看到了fork()系統調用行爲的代碼。主要目標是繪製由此代碼製作的進程樹。我做到了,但是我做了無法解釋,因爲當我運行這個代碼時,它會打印6次glob的值,其中兩個不同,而其他所有值相等。爲什麼?它不應該打印一個glob的值(正確地說是變量glob的值2)?謝謝大家!fork系統調用行爲的一些解釋?

這是代碼:

int main(int argc,char* argv[]){ 

int glob=5; 
int pid=0; 

pid=fork(); 
glob--; 
pid=fork(); 
glob--; 

if (pid!=0) { 
    pid=fork(); 
    glob--; } 

printf("Value=%d\n",glob); 

return 0; 
} 
+0

您是否嘗試過在紙上使用鉛筆執行跟蹤執行,並跟蹤這些值? – Dai

+1

「glob」只是一個元變量名稱,比如'foo'?它沒有很好的選擇,因爲它遮蔽了一個[POSIX標準函數](https://linux.die.net/man/3/glob),這可能會讓人困惑。這不是你看到的問題,但它很混亂。 – unwind

回答

2

你開始與過程1.

fork第一次調用創建一個新的進程 - 2

現在,1和2繼續運行。再次呼叫fork,您現在已經創建了過程3和4.

現在檢查返回的pid是否爲0.如果不是(過程1和過程2不在過程中),請致電fork再次在過程1和2中,並創建過程5和6.

過程1,2,3,4,5和6現在調用printf

+0

在我的工作表上創建了圖形。開始時使用了GLOB = 5的進程A,並且現在B使用了B,GLOB = 5。現在A和B現在glob的「glob--」之後是4.現在A和B現在分別在C和D中分配,C和D中的glob是4.在所有進程的「glob-」GLOB之後爲3。現在啓動IF構造。這隻關注進程的父親,因此A和B進程。在這個語句中,A和B分別創建E和F,然後將GLOB變量減少到2.現在所有的進程都打印Glob的值。對於A和B,值爲2,而對於其他的3。 – Joe

+0

@ user5508485對於進程A B E F和對於C D,glob爲2 3 –

+0

這是爲什麼?If語句中的fork系統調用在調用「glob--」之前調用,因此進程E和F應該是GLOB = 3。 – Joe

0

由於您正在創建三個重複的進程,因此原始和重複的進程操作同時發生,某些操作需要比其他操作更長的時間。

0

第一次打電話給fork()後,您有兩個過程,變量glob遞減到4

在第二次致電fork()後,您有四個過程,變量glob減少到3

不過,只有那名家長在第二個電話的那些(他們收到!= 0從第二次調用fork(),這些都是在總共兩個過程)做fork()第三呼叫(成爲四個過程)和遞減變量glob再次2 ---這就是,父母和孩子,一共有一共有六個的四個過程)

,這樣從總六個只有四個過程,做的glob所以第3減量,您期望四個2值和兩個更多與3