函式原型: 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執行流程:1. 父程序執行後,遇到intmain() 4
14else
if(pid == 0)
15 22}
23else
if(pid >0)
24 32}
33 }
**最終執行結果是:一直列印num_son,偶爾會列印num_father。原因是卡在子程序了,因為時間片到了才會切回父程序,但是很快又回到了子程序。
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函式的...