unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。
例如:int pid = fork();
從fork函式返回,父程序(pid !=0)和子程序(pid=0)擁有相同的user-leverl context(包括data,text以及stack)的拷貝。fork函式的呼叫發生了下列一些列的操作:
1,它為新建立的子程序在process table分配了乙個slot,並且為子程序分配了乙個當前全域性唯一的程序id。
2,核心初始化剛剛分配的子程序的process table slot,從父程序process talbe entry中複製相應的field。例如:父程序的實際使用者id和有效使用者id,父程序的程序組;父程序的nice值;此外,核心會在子程序的 process table slot的parent-process field中填寫父程序的程序id,使子程序才處在程序樹結構中。核心也為子程序初始化各種cpu排程引數,例如:初始優先級別,初始cpu使用和各種 time field的值。
3,核心為子程序設定和reference file相關的一些資訊。首先設定父程序的當前目錄為子程序的當前目錄,並且將當前目錄的引用值增加1,相應的將它對應的inode的count值增加 1。接著,查詢父程序的user file description table,順著找到對應檔案的global file table,將global file table的引用值增加1。因為父子程序share每個檔案的file table,但是他們擁有各自的user file description table。這點類似於dup系統呼叫的功能,只是dup中共享filte table的user file description table在乙個程序中。
4,核心開始建立子程序的user-level contex。它為子程序分配u area,region和輔助的page tables。複製每個region從它的父程序相應的region(和實現有關,可能父子程序共享某個region),並且將這些region依附到子 程序空間。u area有乙個field指向自己的process table slot,除了這個field外,其他的和父程序一樣。
5,核心開始建立子程序的kernel-level context。核心首先複製父程序的context layer 1(包括使用者儲存的暫存器的值和fork系統呼叫的stack frame)到子程序的程序空間。
6,當context建立好以後,父程序完成fork函式,將子程序的狀態變為「ready to run」,並且返回子程序的程序id。
建立程序庫函式fork
unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。例如 int pid fork 從fork函式返回,父程序 pid 0 和子程序 pid 0 擁有相同的user leverl context 包括data,text以及stack 的拷貝。fork函式的...
建立程序 fork函式
最近,我在linux中學到了乙個神奇的函式,名為fork 函式,它的作用是建立程序。它的神奇之處在於呼叫fork 函式時,系統會建立乙個與原來程序幾乎完全相同的程序,大致的意思就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事 就相當於是轉殖了乙個自己。先來看...
程序建立函式fork
函式原型 pid t fork void 標頭檔案 include 函式功能 建立乙個子程序 返回值 1.1 建立失敗 2.0 返回的是子程序 3.0 返回的是父程序,返回值是子程序 id函式特性 1.呼叫一次,會有兩個返回值 2.先返回哪個值,不確定,一般先返回父程序 3.使用者可以通過延時函式,...