fork的面試題

2021-09-24 17:04:56 字數 1188 閱讀 4641

一、fork入門知識

乙個程序,包括**、資料和分配給程序的資源。

fork()函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事。但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。

乙個程序呼叫fork()函式後,系統先給新的程序分配資源,例如儲存資料和**的空間。然後把原來的程序的所有值都複製到新的新程序中,只有少數值與原來的程序的值不同。相當於轉殖了乙個自己。

fork()函式的乙個特點是僅僅被呼叫一次,然後能夠返回兩次,返回值可能有三種:

現在來看**:

#include #include int main()

else

return 0;

}

上邊的程式從fork()函式執行之後,開始執行兩個執行緒,兩個執行緒的**一致。這裡根據fork返回值劃分了三個分支,fpid<0不提了。fpid==0代表進入子執行緒,最後乙個else進入主線程。

輸出為:

moocos-> ./a.out 

father thread 2511,2510,2031

child thread 0,2511,1060

父執行緒的fpid為子執行緒的pid=2511,getpid獲得到父執行緒的pid=2510,getppid獲得父執行緒的父執行緒的pid=2031。

子執行緒的fpid為0,getpid獲得子執行緒的pid=2511,這和父執行緒得到的fpid返回值一致。

令人疑惑的是getppid得到的pid並不是2510,哪位大佬看到可以解答一下。

另外,回到我們的話題,面試題長這樣:

看起來是先輸出了一次hello,然後父執行緒和子執行緒各輸出了一次hello,答案是3?

實際上是4次。

fork()函式會把它所在語句以後的語句複製到乙個子程序裡,單獨執行。

如果printf函式最後沒有"\n",則輸出緩衝區不會被立即清空,而fork函式會把輸出緩衝區裡的內容也都複製到子程序裡。

所以,父程序和子程序各輸出2個hello,共4個。

如果第乙個printf(「hello」);寫成printf(「hello\n」);,則只會輸出3個hello,父程序2個,子程序1個。

根據面試題談fork

先看fork 返回值 子程序中返回0,父程序中返回子程序id,出錯返回 1。fork有以下幾個特點 1.子程序是父程序的副本。子程序獲得父程序資料空間 堆和棧的副本 主要是資料結構的副本 2.父子程序不共享這些儲存空間。父子程序共享正文端。3.子程序對變數所作的改變並不影響父程序中該變數的值。4.標...

乙個fork的面試題

題目 請問下面的程式一共輸出多少個 include inlcude int main return 0 可能開始的時候大家都以為會輸出6個 但是結果輸出了8個 要弄明白這個題,還是先從fork 呼叫開始 1 fork 系統呼叫是unix下以自身程序建立子程序的系統呼叫,一次呼叫,兩次返回,如果返回時...

乙個fork的面試題

前兩天有人問了個關於unix的fork 系統呼叫的面試題,這個題正好是我大約十年前找工作時某公司問我的乙個題,我覺得比較有趣,寫篇文章與大家分享一下。這個題是這樣的 題目 請問下面的程式一共輸出多少個 12 3456 78910 1112 1314 include include include i...