關於fork函式的執行問題(源於騰訊校招筆試題目)

2021-06-09 18:05:35 字數 985 閱讀 4001

1、#include

#include

#include

int main()    

return 0;

}輸出結果為 8個「-」

2、#include

#include

#include

int main()    

return 0;

}輸出結果為 6個「-」

很納悶,為什麼乙個\n換行符會對輸出結果產生影響呢?究其原因就得考究fork函式是如何產生子程序。在執行fork以後,作業系統複製乙份當前執行的程序的資料,包括程序的資料空間、堆和棧等,並且在程序表中相應為它建立乙個新的表項。上下文也是原程序(父程序)的拷貝。但是父、子程序共享正文段,也就是cpu執行的機器指令部分,這個可共享的,在儲存器中只需要乙個副本,而且這個副本通常是唯讀的。所以子程序函式執行點是從父程序中呼叫fork函式開始往下執行的。關於這一點,理解父子程序關係的話,應該不難理解。而這個\n換行符對輸出產生的影響則是和printf函式的緩衝機制有關。當呼叫printf函式的時候,函式中的輸出資料是先被放入緩衝區中,而並沒有直接輸出到螢幕,直到往緩衝區中壓入\n換行符或者是呼叫了flush之類的函式,才會把資料輸出到螢幕。而這個緩衝區在每個子程序都擁有乙份副本。所以現在就知道該如何分析了。

首先,先分析沒有加\n換行符的函式,i=0時,父程序呼叫fork函式,此時父程序中的緩衝區中有0個「-」,其子程序2中的上下文與父程序相同,因此子程序將執行1次for迴圈,此時,該程序緩衝區擁有1個「-」,並再次呼叫fork產生新的子程序3,上下文內容與產生其的父程序相同,也就是緩衝區中擁有乙個「-」,但是此時i=1,新產生的子程序將不再執行for迴圈。回到主程序,也就是乙個父程序,父程序將執行兩次for迴圈,第二次for迴圈將產生乙個新的子程序4,其緩衝區中有乙個「-」。最後別忘了每乙個程序都是從fork呼叫點開始執行的,所以每個程序都會輸出乙個「-」,加起來就是8個了。

對於程式2,則在上述分析過程中,注意一下緩衝區中的資料何時被清理,就可以算出結果了。

關於fork函式執行的幾種情況

輸出6個 先看這段 1 2 3 4 5 6 7 8 9 10 11 12 13 intmain void wait null wait null return0 輸出8個 1.fork 系統呼叫是unix下以自身程序建立子程序的系統呼叫,一次呼叫,兩次返回,如果返回是0,則是子程序,如果返回值 0,...

關於fork函式

我們可以使用fork呼叫建立乙個新程序,使用fork需包含的標頭檔案及fork的宣告如下 include include pid t fork void 這個系統呼叫複製當前程序,在程序表中建立乙個新的表項,新表項中的許多屬性與當前程序是完全相同的。新程序幾乎與原程序一模一樣,執行的 也完全相同,但...

關於fork的小問題

在閱讀apue的時候,試著在cygwin中測試乙個源程式,如下 1 include 2 include 3 include 4 include 56 define maxline 512 7 static void sig int int 8 int main int argc,char argv ...