第八章 程序控制

2021-05-25 18:09:20 字數 1780 閱讀 6673

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來描述。在有...