1、fork 函式原型:pid_t fork(void);
函式返回值型別為 pid_t,實質是 int 型別,linux 核心2.4.0版本的定義是:
typedef int _kernel_pid_t;
typedef _kernel_pid_t pid_t;
2、fork 函式的底層實現:
fork()、vfork()和clone()的底層均呼叫do_fork(),只是傳遞引數和標誌不同。該函式定義了乙個task_struct型別的指標,用來接收即將為子程序所分配的程序描述符;使用alloc_pidmap()為子程序分配pid引數;呼叫copy_process()方法建立子程序的描述符,並建立子程序所需的其他資料結構。
3、fork 函式會新生成乙個程序,呼叫 fork 函式的程序為父程序,新生成的程序為子程序。
fork 函式呼叫一次,返回兩次:
(1)在父程序中返回子程序的 pid
(2)在子程序中返回0
失敗則返回 -1。
4、fork 函式在生成子程序時,用到了寫時拷貝技術。
寫時拷貝:不執行乙個父程序資料段、堆、棧的完全複製,這些區域由父、子程序共享,而核心將他們的訪問許可權改為唯讀的。當任意乙個程序試圖修改共享記憶體中的資料,則核心只為修改區域的那塊記憶體製作乙個副本,並且是以虛擬儲存器系統中的「一頁」為單位複製。
5、僵死程序:子程序先於父程序結束,父程序沒有呼叫 wait 獲取子程序的退出碼,這時,子程序就變為僵死程序。
(1)程式執行後,輸出了3個a;
int main()
(2)程式執行後,輸出了6個a;
int main()
}
(3)程式執行後,輸出了8個a;(注意,輸出語句後沒有「\n」,資料被暫時存在緩衝區,最後全部被列印)
int main()
}
fork程序建立
fork建立子程序,fork函式返回兩個值,當為0時,則認為是子程序 塊執行區域,而不為0則是父程序 塊執行區域。我們需要知道的是,fork子程序可以與父程序共享部分程序上下文,而與此不同的是execl函式,一旦開始執行到execl函式時,啟動被呼叫的函式,後面的 則不再執行,而是直接執行呼叫的程式...
fork建立程序
1.程序的建立 fork 函式是建立子程序的函式,在主函式中呼叫fork會產生乙個子程序 列印出來的結果是 if語句是條件語句但卻兩個都列印了,兩個條件都滿足,也就是說兩個都執行,但卻不是一條執行流,那麼可以得出肯定還有乙個程序在列印另乙個。都記得fork 之後有兩個程序,乙個父程序,乙個子程序,父...
建立程序 fork函式
最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...