學習作業系統程序時遇到用fork建立子程序,一下所寫均是個人結合網上一些資料和個人思考所得,歡迎拍磚!
【程序建立的原因】
導致程序建立的一般有事件有:1新的批處理作業、2互動登陸(終端使用者登陸到系統)、3作業系統因為提供一項服務而建立、4由現有的程序派生。
*注:作業系統為另乙個程序的顯示請求建立乙個程序時,這個動作稱為程序派生。
父程序與子程序:當乙個程序派生另外乙個程序時,前乙個稱做父程序,被派生的程序稱做子程序。
【引入fork()函式】
unix中的程序建立是通過核心系統呼叫fork()實現的。posix 標準中,fork 的行為是這樣的:複製整個使用者空間的資料以及所有系統物件,然後僅複製當前執行緒到子程序。
當乙個程序產生乙個fork請求時,作業系統執行以下功能:
1)為新程序(子程序)在程序表中分配乙個空項和賦予乙個唯一的程序id(識別符號)。
2)子程序繼承了父程序所有的檔案。
fork()成功完成後,子程序返回0,父程序返回子程序id,父子程序繼續執行fork()函式。否則,父程序返回-1,子程序不能建立並應設定error以指示錯誤。
#include
2:#include
3:#include
4:
5:using
namespace std;
6: main()
7:執行結果:
對於新手來說,無論如何思考,得到的執行效果只能是"this is parent!"或者「this is chile"其中乙個。下面我引用乙個網友所寫和個人修改:
當程式執行到語句:pid=fork();
作業系統建立乙個新的程序(子程序),並且在程序表中相應為它建立乙個新的表項。新程序和原有程序的可執行程式是同乙個程式;上下文和資料,絕大部分就是原程序(父程序)的拷貝,但它們是兩個相互 獨立的程序!此時程式暫存器pc,在父、子程序的上下文中都聲稱,這個程序目前執行到fork呼叫即將返回(此時子程序不占有cpu,子程序的pc不是真正儲存在暫存器中,而是作為程序上下文儲存在程序表中 的對應表項內)。問題是怎麼返回,在父子程序中就分道揚鑣。
父程序繼續執行,作業系統對fork的實現,使這個呼叫在父程序中返回剛剛建立的子程序的pid(乙個正整數),所以下面的if語句中pid<0, pid==0的兩個分支都不會執行。所以輸出
this is parent...
子程序在之後的某個時候得到排程,它的上下文被換入,佔據 cpu,作業系統對fork的實現,使得子程序中fork呼叫返回0。所以在這個程序(注意這不是父程序了哦,雖然是同乙個程式,但是這是同乙個程式的另外一次執行,在作業系統中這次執行是由另外乙個程序表示的,從執行的角度說和父程序相互獨立)中pid=0。這個程序繼續執行的過程中,if語句中pid<0不滿足,但是pid==0是true。所以輸出
this is child...
我想你比較困惑的就是,為什麼看上去程式中互斥的兩個分支都被執行了。在乙個程式的一次執行中,這當然是不可能的;但是你看到的兩行輸出是來自兩個程序,這兩個程序來自同乙個程式的兩次執行。
fork函式總結
在unix linux中用fork函式建立乙個新的程序。程序是由當前已有程序呼叫fork函式建立,分叉的程序叫子程序,建立者叫父程序。該函式的特點是呼叫一次,返回兩次,一次是在父程序,一次是在子程序。兩次返回的區別是子程序的返回值為0,父程序的返回值是新子程序的id。子程序與父程序繼續併發執行。如果...
fork 函式 fork 函式的使用
fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...
c 中的fork函式 FORK()函式
乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...