fork建立程序

2021-09-25 19:23:14 字數 1311 閱讀 6636

1.程序的建立

fork()函式是建立子程序的函式,在主函式中呼叫fork會產生乙個子程序

列印出來的結果是:

if語句是條件語句但卻兩個都列印了,兩個條件都滿足,也就是說兩個都執行,但卻不是一條執行流,那麼可以得出肯定還有乙個程序在列印另乙個。都記得fork()之後有兩個程序,乙個父程序,乙個子程序,父程序返回子程序的pid,子程序返回0;也就是說呼叫一次返回兩次。

有沒有發現 我在父程序執行時加了wait()函式,因為fork函式在建立子程序時,並不能確定是子程序先執行還是父程序先執行,防止子程序成為僵死程序(程序主體結束,但其pcb沒有釋放),所以在父程序中呼叫wait函式,讓其阻塞,等待子程序執行完畢後並獲得子程序的退出狀態,處理完子程序後再執行父程序,也就是同步執行。關於wait函式以及僵死程序、阻塞在後續解釋。

那麼fork()這個函式是怎麼建立程序的呢?

其實是系統呼叫clone()實現fork()然後clone()再去呼叫do_fork(),do_fork()還不是最後的執行者最後的執行者是copy_process()這個函式,它具體做如下事:

呼叫dup_task_struct為新程序建立乙個核心棧、thread_info結構和task_struct,這些值與當前程序的值相同。此時,子程序和父程序的描述符完全相同。

檢查建立完畢後,當前使用者所擁有的程序數沒有超出給他分配的資源的限制。

將子程序的狀態設定為不可中斷狀態,保證它不會投入執行.

copy_process()函式呼叫copy_flags()更新task_struct的flags成員。表明程序是否有超級使用者許可權的標誌被清零,表明還沒有呼叫exec()函式的標誌被設定。

呼叫get_pid()為新程序獲取有效的pid。

根據clone()傳遞的引數標誌,copy_procsee()拷貝或共享開啟的檔案、檔案系統資訊、訊號處理函式程序位址空間和命名空間等,一般來說,這些資源會被程序中的所有執行緒所共享,否則這些資源對每個程序來說是不共享的,因此拷貝到這裡。

讓父程序和子程序平分剩餘的時間片。

copy_process()返回乙個指向子程序的指標。

當完成後,再返回到do_fork()函式,如果copy_process()函式成功返回,新建立的子程序被喚醒並投入到執行。核心一般會讓子程序先執行,因為子程序一般會呼叫exec函式,這樣可以避免寫時拷貝的開銷,如果時父程序先執行的話,有可能會開始向位址空間寫入。

fork程序建立

fork建立子程序,fork函式返回兩個值,當為0時,則認為是子程序 塊執行區域,而不為0則是父程序 塊執行區域。我們需要知道的是,fork子程序可以與父程序共享部分程序上下文,而與此不同的是execl函式,一旦開始執行到execl函式時,啟動被呼叫的函式,後面的 則不再執行,而是直接執行呼叫的程式...

建立程序 fork函式

最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...

Linux 程序建立 fork

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 vfor...