研究linux函式 之 fork()

2021-10-13 19:00:43 字數 1155 閱讀 2175

程序可以看做程式的一次執行過程,在linux下每個程序有唯一的pid來標識程序。

特殊程序:

id為0的是排程程序,該程序是核心的一部分,不執行任何磁碟上的程式

id為1的是init程序,init通常讀取與系統有關的初始化檔案(/etc/rc*檔案、/etc/inittab檔案、/etc/init.d/中的檔案)

id為2的是頁守護程序,負責支援虛擬儲存器系統的分頁操作

linux用程序表來儲存正在執行的程序

命令ps aux可以檢視所有正在執行的程式

ps -ef | grep 搜尋內容可以查詢想要的程序

程序在linux中呈樹狀結構,init為根節點,其它程序均有父程序,某程序的父程序就是啟動這個程序的程序,這個程序叫做父程序的子程序。

fork的作用是複製乙個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是乙個全新的程序,並作為原程序的子程序。

#include

pid_t fork

(void);

//子程序返回0

//父程序返回子程序id

//出錯返回-1

fork函式被呼叫一次將返回兩次,在子程序中返回0,在父程序中返回子程序的id。

子程序獲得父程序的資料空間、堆、棧副本

init是永遠不會死亡的。看下面的linux父子程序終止的先後順序不同產生不同的結果:

1)父程序先於子程序終止:

此種情況就是孤兒程序。當父程序先退出時,系統會讓init程序接管子程序 。這也是讓程式進行後台執行的一種方式,系統apidaemon其實也是呼叫了這一過程

2)子程序先於父程序終止,而父程序又沒有呼叫wait或waitpid函式

此種情況子程序進入殭屍狀態,且會一直保持下去直到系統重啟。子程序處於殭屍狀態時,核心只儲存程序的一些必要資訊以備父程序所需。此時子程序始終占有著資源,同時也減少了系統可以建立的最大程序數。

殭屍程序:乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被稱為殭屍程序(zombie)。ps命令將殭屍程序的狀態列印為z 。

3)子程序先於父程序終止,而父程序呼叫了wait或waitpid函式

此時父程序會等待子程序結束。

Linux學習之 fork函式

nfork函式建立乙個新程序,新程序被稱為子程序 n函式原型 pid t fork void n返回值 fork函式呼叫一次,但是返回兩次 在子程序中返回0,在父程序中返回子程序id,出 錯返回 1。通過返回值,可以確定是在父程序還是子程序中。n子程序和父程序繼續執行fork呼叫之後的指令。子程序是...

Linux學習之「fork函式」

n返回值 fork函式呼叫一次,但是返回兩次 在子程序中返回0,在父程序中返回子程序id,出錯返回 1。通過返回值,可以確定是在父程序還是子程序中。n子程序和父程序繼續執行fork呼叫之後的指令。子程序是父程序的副本 1.子程序獲得父程序資料空間 堆和棧的副本 父子程序並不共享這些儲存空間。2.父子...

程序管理之fork函式

include include pid t fork void fork函式在父程序中返回子程序的pid,在子程序中返回0。注意在子程序中返回的0,並不是子程序的pid,子程序的pid在父程序的返回值中儲存。而子程序的返回值是為了標識它是子程序,用來區分父子程序的。那麼為什麼這樣設計父子程序的返回值...