領卓教育 根據大神部落格總結fork輸出時的

2021-08-29 20:50:45 字數 1477 閱讀 5286

今天看了dianacody大神的關於fork函式初級解析的一篇部落格

想小小總結一下其中的一些簡單易記的公式 以便後用 貼出大神部落格位址便於參考

首先宣告一下,因為平時基本不用電腦打字,所以語言和邏輯上若有紕漏還望見諒。

一:fork();

fork();

fork();

. . .

fork();//第n次fork

printf(「a\n」);

根據程式順序進行和fork()函式的特性(可以去前面鏈結尋找)可以知道只需要計算出fork出的子程式的數量加上父程式1就是輸出a的數量。

計算公式為(1+2+4+…+2^(n-1))+1

子程式數量計算公式則為(1+2+4+…+2^(n-1))

二:for(int i=0;i此型別與上一型別略有不同,不同之處在於一型別全部fork完成之後才輸出,而此型別在每次fork之後都要輸出一次。所以計算方法應該 是fork的總次數乘以2(每次fork之後的輸出都為兩次)。

所以計算fork總次數公式應該為(1+2+4+…+2^(n-1))與子程式數量計算一致,畢竟每次fork都會產生乙個子程式。

輸出a數量計算公式:(1+2+4+…+2^(n-1))*2

三:for(int i=0;i此型別與上一型別只有乙個「\n」的區別,輸出可就大大不同了。究其原因就要說到printf的緩衝機制了。為了方便讀者理解之後計算公式的推理,就簡單說一下這裡的緩衝機制,如果說的不明白讀者也可以自行去前面的鏈結裡找尋合理的解釋。

簡單來說當你打出printf時,內容並不會立即列印到螢幕上,而是被放入了stdout緩衝佇列中,當碰到「\n」或者程式結束時才會重新整理這個緩衝區,其中的內容才列印到螢幕上。

當fork時,若父程式的緩衝區之中有a存在,那麼子程式的緩衝區也會照樣複製乙份並存在同樣數量的a(我的理解就是每個程式都擁有乙個快取區)。所以輸出a的數量會比二型別更多。那該如何計算呢?讀者可以這樣思考:如果可以知道每個程式可以輸出多少個a就方便計算總數量了。可以採用類推法。

第一次迴圈:

程式1:a

程式2:a

第二次迴圈:

程式1:aa

程式2:aa

程式3:aa(複製了父程式乙個a並自己printf乙個a)

程式4:aa

第三次迴圈:

程式1:aaa

程式2:aaa

程式3:aaa

程式4:aaa

程式5:aaa(複製了父程式兩個個a並自己printf乙個a)

。。。程式8:aaa

寫到這裡讀者應該看出來了,每個程式快取區里的a數與迴圈數是一致的,所以只要用所有程式數乘以迴圈數即可計算出a的數量

計算公式:(-1+2+4+…+2^(n-1)+1)*n

注意for(int i=0;i的結果與其完全一致,原因讀者可以自己考慮。

暫時就想到這三種特徵的計算,建議讀者有不懂的地方一定去鏈結位址裡一**竟,知其然也要知其所以然,這樣遇到fork的問題才會得心應手,只記幾個公式不過是霧裡看花而已。

Sqlite3 領卓教育

1.安裝資料庫 sudo apt get install sqlite3 2.執行資料庫 sqlite3 3.退出資料庫 exit 4.開啟資料庫檔案 sqlite3 xx.db 若存在,則開啟。不存在,則建立再開啟 5.顯示當前開啟 的資料庫檔案 database 6.在資料庫中建立乙個表 cre...

領卓教育 隨機點名程式

簡單的隨機點名系統,利用c語言編寫 如下 include include char name int main printf n return 0 首先定義陣列,陣列內的成員是即將隨機的名字,本程式以作者班級同學為例 include 是linux下時間和日期的標頭檔案 gettimeofday是獲得...

領卓教育 字元裝置實現流程

如何一步一步執行驅動 在進行驅動載入的過程中使用 insmod hello.ko時,會執行驅動的載入函式,module init hello init hello init 在驅動的載入函式中會進行裝置的註冊 1.mkdev hello major,hello minor 去生成裝置號 2.向核心去...