unix linux多程序程式設計2 程序控制

2021-06-07 03:15:22 字數 3110 閱讀 3003

主要內容

①程序建立

②執行程式

③程序終止

④程序屬性

1:程序識別符號

1.1

①每個程序都有乙份非負整數表示的唯一程序id

②程序id可以重新,乙個程序結束之後可以,這個id可以被其他程序所使用,當unix普遍都採用了延遲重用演算法。使得某乙個程序結束之後其id不會馬上被新的程序所使用,以防止將新程序誤認為之前結束的程序.

④程序id為1的通常是init程序,負責自舉核心之後,啟動乙個unix系統。注意它是乙個普通使用者程序,但是以超級使用者的許可權執行。

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

1.2獲取程序標識的函式

#include

pid_t getpid();

//獲取程序id

pid_t getppid();

//獲取父程序id

pid_t getuid();

//獲取實際使用者id,執行這個程序的使用者是誰

pid_t geteuid();

//獲取有效使用者id,用於檔案訪問許可權檢查,決定了對於某個檔案的訪問許可權

pid_t

getgid();

pid_t getegid();

2:fork函式

2.1①函式原型

#include

pid_t fork(void);

②建立乙個新的程序

③呼叫一次,返回兩次子程序中返回0,父程序當中返回子程序的id

④子程序是父程序的副本,獲得了父程序的程序空間資料,包括資料段,bss段,堆,棧。而正文段則是父子程序共享。現在很多系統的實現並不採用完全複製的方法,而是採用寫時複製技術。父子程序共享,核心將此區域設定為唯讀,父子程序任何乙個試圖修改,核心都將為修改區域的記憶體製作乙個副本。

2.2檔案共享

①父子程序共享檔案表項

②通常對父子程序對檔案描述符的處理方法

a:父程序等待子程序操作檔案

b:父子程序使用不同的**段,即在fork之後,父子程序各自關閉不需要的檔案描述符。

③父子程序檔案共享圖示

3.3fork的兩種常見用法

①父程序希望複製自己,父子程序執行不同**.例如網路伺服器,父程序等待請求,當請求到來之後,子程序處理請求,而父程序繼續等待下次請求。

②乙個程序需要執行乙個不同的程式, 子程序fork返回之後立刻呼叫exec

3:vfork函式

3.1 vfork和fork的區別

①vfork的目的就是執行乙個新的程式.

②vfork並不複製父程序的位址空間,相反它在呼叫exit或者exec之前它在父程序的位址空間中執行.

③vfork保證子程序先執行,只有當子程序呼叫exec或者exit之後,父程序才有可能被排程執行。

4:程序的結束

4.1無論是正常退出還是異常終止的程序,其父程序都可以獲得其終止狀態.正常退出的程序,通過呼叫exit _exit 或者_exit將其退出狀態作為引數傳遞給函式而對於異常終止的程序,核心產生乙個指示異常終止原因的終止狀態

4.2

父程序已經結束的程序都將會被init程序收養

4.3僵死程序

乙個 已經終止,但父程序沒有對其進行善後處理的程序稱為僵死程序.

乙個程序結束時,如果父程序仍然存在,而且父程序在fork之前既沒有安裝sigchid訊號處理函式呼叫wait/waitpid等待子程序結束,也沒有顯示的忽略該訊號,則這個子程序在父程序結束之前都為僵死程序,

它已經放棄了幾乎所有記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位 置,記載該程序的退出狀態等資訊供其他程序收集,除此之外,殭屍程序不再占有任何記憶體空間.

5:wait和waitpid

5.1函式原型

#include

pid_t wait(int *statloc)

pid_t wait(pid_t pid, int *statloc, int options)

5.2

乙個程序正常或者異常終止,核心都會向其父程序傳送乙個sigchld訊號,由於子程序的終止可能發生在任何時候,所以這也是個非同步訊號。對於這個訊號父程序可以選擇忽略,或者提供乙個訊號處理函式。如果什麼不做,系統是預設忽略,如果採用預設忽略的方式那麼子程序就會成為乙個僵死程序(父程序為init除外)

。如果父程序呼叫了wait或者waitpid則會傳送如下情況。

a:如果所有子程序均在執行,則阻塞

b:如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回。

c:如果沒有任何子程序則立即返回錯誤

5.3 wait和waitpid的區別

wait在第乙個子程序終止之前會使父程序一直處於阻塞狀態而waitpid不會,waitpid有若干個選項可以控制所等待的程序。

注意呼叫一次之會等待第乙個程序的結束,

5.4wait.h中定義了四個互斥的巨集來獲取終止原因。p180

5.5fork兩次,一種避免產生僵死程序的方法

原理:程序a fork出程序b,之後程序b發 fork出程序c,程序b立即退出,程序c呼叫sleep函式保證程序b先退出,程序a中呼叫waitpid函式等待程序b退出。

我們實際需要的新的程序是c,程序b做個中間程序,因為程序b結束之後,程序c成為init的子程序,所以它不會成為僵死程序,而程序a在程序b結束之後它就不會再阻塞。

6:exec函式

6.1:總共有六個exec函式,區別如下

p:使用環境變數中的path

l:使用list

v:使用陣列

e:使用自定義的環境變數

6.2:大部分unix實現當中只有乙個execve是系統呼叫,其他六個均為庫函式

unix linux多程序程式設計3 程序控制

1 程序組 1.1與同意作業關聯的乙個或者多個程序的集合稱為程序組,可以接收來自同一終端的各種訊號。可以用getpgrp 來或者程序的程序組id。1.2組長程序 每個程序組都有乙個組長程序,其標誌是程序id等於程序組id,組長程序可以建立乙個程序組,建立該組中的程序,然後終止。但組長程序終止,並不意...

多程序程式設計

linux下乙個程序在記憶體裡有三部份的資料,就是 資料段 堆疊段 和 段 其實學過組合語言的人一定知道,一般的cpu象i386,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...

多程序程式設計

一。多程序程式設計 1.函式學習 1 建立程序 1.函式名 fork 函式原型 pid t fork void 函式功能 建立乙個子程序 所屬標頭檔案 返回值 成功時 在父程序中返回子程序的pid 在子程序中返回是0 失敗時 子程序返回的 1 引數說明 無引數 2.函式名 vfork 函式原型 pi...