程序建立函式fork

2022-05-07 03:03:11 字數 2282 閱讀 4079

函式原型: pid_t fork(void)

標頭檔案:  #include

函式功能: 建立乙個子程序

返回值:  1.   -1 建立失敗

2.   0 返回的是子程序

3.   >0 返回的是父程序,返回值是子程序

id函式特性:  1. 呼叫一次,會有兩個返回值

2. 先返回哪個值,不確定,一般先返回父程序

3. 使用者可以通過延時函式,決定程序的執行先後順序。

4. 建立後,子程序複製父程序空間,這個空間子程序所獨有的只有它的程序號、計數器和資源使用,

其他的和父程序

空間一樣,兩個空間相互獨立,互不干涉即使全域性變數,在子程序中不會隨父程序中變數的

值的改變而改變。

函式框架:  

1 #inlcude 2 #include 3

intmain() 4

14else

if(pid == 0)15

19else

if(pid > 0)20

24//

父子程序共有

25 }

分析:獨有的只會執行一次,共有的會執行兩次。

程序切換: 1. 通過延時類函式(可控):  

sleep(

s延時)

usleep(us

延時)2. 時間片到了(不可控)

注意: 延時會讓程式處於等待態,所謂等待態,就是先去執行已經處於就緒態的程式,什麼時候延時時間到了,程式

就會處於就緒態。等其他程式執行完,或者時間片到了,再切換回來,從上次的斷點處繼續執行。兩個程序之間

沒有優先順序關係,不存在打斷關係,只有子程序執行完了,或者進入等待態,或者時間片到了才會進入父程序。

示例: 下面的**示例,如果沒有時間片的影響,在進入子程序以後,會一直卡在子程序,永遠不會再回到父程序,因

受時間片的影響,還會過一段時間就切換回父程序。 

#include 2 #include 3

intmain() 4

14else

if(pid == 0)

15 22}

23else

if(pid >0)

24 32}

33 }

**最終執行結果是:一直列印num_son,偶爾會列印num_father。原因是卡在子程序了,因為時間片到了才會切回父程序,但是很快又回到了子程序。

執行流程:1. 父程序執行後,遇到

fork()

之前,都是父程序獨有的程式

2. 當遇到

fork

函式後,開始建立子程序,一般先返回父程序

3. 在進入

if框架之前,

fork

下的程式是子程序和父程序共有的

4. 進入

pid>0

父程序獨有的框架,如果父程序獨有中無等待類操作,父程序獨有的執行完,接著執行

if框架外程式,

直到父程序執行完,然後再執行子程序,這時候子程序已經變為了孤兒程序。

1 #inlcude 2 #include 3

intmain()414

else

if(pid == 0)15

19else

if(pid > 0)20

24//

父子程序共有

25 }

執行步驟:

執行分析: fork有兩個返回值,但是返回順序有先後關係,第乙個返回值0,先執行的是父程序,

pid>0

的elseif

執行結束後,

父程序就結束了,此時,子程序變成了孤兒程序,

被祖先程序接收,因為會返回兩個返回值,所以又會返回乙個

值,程式從fork函式處又執行一遍,此時返回的是

=0返回值

的值,此時再執行

==0的

elsif

。示例**:

建立程序程式模板:

條件: 1.避免孤兒程序和殭屍程序

2.不存在父子程序共有的,全是獨有的

建立程序 fork函式

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

建立程序庫函式fork

unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。例如 int pid fork 從fork函式返回,父程序 pid 0 和子程序 pid 0 擁有相同的user leverl context 包括data,text以及stack 的拷貝。fork函式的...

建立程序庫函式fork

unix作業系統提供了庫函式fork來建立乙個新的程序,本文分析一下fork呼叫背後發生了什麼。例如 int pid fork 從fork函式返回,父程序 pid 0 和子程序 pid 0 擁有相同的user leverl context 包括data,text以及stack 的拷貝。fork函式的...