1. 程序標示符pid
id為1 的通常是 init 程序。 在自舉過程中被核心呼叫。該程序的程式檔案時 /sbin/init。 此程序負責在自舉核心後啟動乙個unix系統。 讀與系統相關的初始化檔案(/etc/rc* 或 /etc/inittab 以及/etc/init.d中的檔案),並引導系統到乙個狀態(如多使用者)。init絕不會終止,它是乙個普通的使用者程序(區別於核心程序),但它以超級使用者特權執行。如果父程序在子程序終止之前就結束了,則該父程序的所有子程序(孤兒程序)的父程序id(ppdi)都會被設成 1。
2. fork函式
#include
pid_t fork(void)
由fork建立的新程序被成為子程序(child process)。 fork函式被呼叫一次,但返回兩次。兩次分會的唯一區別是子程序的返回值是0. 而父程序的返回值則是新子程序的程序id。
檔案共享
由於fork函式複製了父程序的檔案開啟表給子程序,故具有父子關係的程序將共享開啟檔案。p175
vfork函式
vfork和fork的功能基本一致,均是建立建立乙個新程序。但是有兩點不同:
a) vfork建立的新程序專門用於執行新的程式,所以它不會全部複製父程序位址空間內的所有資訊給子程序。通常呼叫vfork後,子程序將緊跟著呼叫exec
b) vfork保證子程序首先執行,父程序掛起,直至子程序呼叫exec或exit,父程序才重新執行
4。wait 和 waitpid函式
當乙個程序結束的時候,核心將傳送乙個sigchld訊號給其父程序。下面兩個函式用於父程序等待子程序結束
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
both return process id if ok, 0 and -1 on error
引數說明:
int *statloc用於儲存結束程序的終止狀態。但如果我們不關心子程序的結束狀態,可以給null指標。
pid_t pid : waitpid指定等待程序的id號。
若指定pid=-1,則其功能與wait一致,相當於無阻塞版的wait
兩者區別:
wait將阻塞呼叫程序,直至該程序任何乙個子程序結束。但如果該程序有殭屍子程序,則wait函式將立即返回,statloc存放該殭屍程序的終止狀態。
(殭屍程序,zombie process,指已經結束的程序,但其父程序並未獲取其終止狀態,釋放資源等操作的程序)
waitpid等待process id為pid的子程序結束。即利用該函式可以撲獲指定的程序結束的狀態,但是並不阻塞呼叫者
5。exec函式
前面提到vfork,建立的子程序用於執行新的程式,共有六種形式的exec p188
記憶方法:
l : 表示使用引數列表(list)
e:表示使用新的環境變數,不從當前繼承
p: 表示使用檔名,並從path環境進行搜尋
6. system函式
利用system函式可以在程式中方便的呼叫shell命令.
例如,想向乙個檔案中儲存當前時間,可以很容易實現 system("date > file");
system函式原形為 :
int system(const char *cmdstring);
system函式由fork,exec,waitpid來實現
第八章 程序控制
1 fork是核心建立新程序的唯一方法 除了交換程序,init和頁精靈程序 2 子程序獲得父程序的資料空間,堆,棧。子程序的這些空間是父程序的拷貝,並不共享。子程序也會複製父程序的io快取 程式8.1的例子 但是很多實現並不做父程序資料段和堆的完全拷貝,有的使用了 寫時複製 的技術。3 從下面的例子...
第八章 程序控制 waitpid函式
waitpid 等待子程序中斷或結束 表頭檔案 include include 定義函式 pid t waitpid pid t pid,int status,int options 函式說明 waitpid 會暫時停止目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫 wait 時子程序已經結...
第八章 程序排程和時間
總體來講,對於作業系統而言,處理機在任意時刻只能執行乙個程序。linux系統的排程基於分時 time sharing 技術 多個程序以 時間多路復用 方式執行,cpu的時間被分成 片 slice 每個可執行程序可以分配一片。在linux中,與程序相關的引數用資料結構task struct來描述。在有...