2017-03-08 18 views
2

我想了解下面的fork()函數的順序是如何工作的?我想了解一系列的fork()函數是如何工作的?

   #include <iostream> 
       #include <sys/types.h> 
       #include <unistd.h> 
       using namespace std; 
       int main() { 
        fork(); cout << "1 " << endl;//calling fork 1 
        fork(); cout << "2 " << endl; // calling fork 2 
        fork(); cout << "3 " << endl;// calling fork 3 

        fork(); cout<<" 4 "<<endl;//calling fork 4 
        return 0; 
       } 
  1. 將我上面的程序流程結構是這樣的,是我的假設是正確的?

            parent(x) 
               /  |  | \ 
               1  2  3 4 
             / | \ /\ | 
              2 3 4 3 4 4 
             /\ |  | 
             3 4 4  4 
             | 
             4 
    
    • 按我的理解,該方案將產生16個進程是嗎?

    • 是否可以在2之前輸出3?如果是這樣以及爲什麼?

+1

對於最後一個問題,僅僅因爲創建了一個新進程,它不必立即開始運行。父進程仍然可以運行,並且由於您有多個其他進程,其中一個進程可以在其他進程打印前輕鬆打印2和3. –

+1

呵呵,請不要使用多種語言標記,除非您正在比較語言的功能標籤。只使用你實際編程的語言(本例中是C++)。 –

+0

樹中的數字代表什麼? 每個節點都是一個進程? 此外,如果這有助於1將被打印兩次2次。 2將被打印4次,3 - > 8,4 - > 16 並且程序將爲您製作的程序調用生成15個新進程+1。 – user183833

回答

1

根據我的理解程序會產生16個進程我是對嗎?

第一個過程將分叉一個新的過程。那是一個。現在有兩個進程正在運行。

作爲第二個分支的結果,這兩個進程將創建兩個進程。現在有四個進程正在運行。

下一個分支導致八個正在運行的進程。

最後一個分支導致十六個進程在運行。這比你剛開始的時候多了15倍,總體來說,叉子創造了15個新的流程。

是否可以在2之前輸出3?如果是這樣以及爲什麼?

是的,從一個非常孤立的角度來看,它有可能發生。 A 3將永遠不會出現在前2之前,但有可能3後面跟着2。

爲了打印「3」,必須打印「2」。沒有執行路徑將在單個進程的「2」之前打印「3」。

但是:

fork(); cout << "2 " << endl; 

有此進程後運行的四個過程。沒有任何東西能夠保證所有人都會在他們或他們的後代打印「3」之前打印出「2」。

例如,四個進程中的一個可能會被操作系統優先級降低,直到其他三個進程打印它們的2s,分叉並打印它們的3s纔會到達其cout << "2"。現在,在其他進程已經脫口而出的「3」之後,睡眠過程醒來並打印它的「2」。最終結果將是一個「3」,然後是「2」。

但是在這些「3」之前必須有其他的「2」。

0

按我的理解,程序會生成16個進程是嗎?

總共有16個過程。程序運行時,由於對fork()的調用,將會生成另外15個進程。

是否可以在2之前輸出3?如果是這樣以及爲什麼?

我不這麼認爲。標準庫函數不會讓您控制將分叉進程的輸出排序到stdout。因此,它們以無法由程序控制的順序寫入stdout

+0

正如我在評論中表示的那樣,並且是迂腐(對不起:P),程序將生成15個新進程,另外一個將是用戶調用的進程。 – user183833

+0

@ user183833,夠公平的。 –