程序程式替換(原理及exec 函式簇)

2021-10-24 13:19:37 字數 1591 閱讀 4827

替換**段和資料段,從磁碟載入新的**段和資料段到物理記憶體,用頁表對映回程序虛擬位址空間的**段、資料段,同時應該將堆疊、命令列引數等變為最初狀態,pid 不變、環境變數不變、

exec 函式簇:多個 ecec 結構的函式

int

execl

(const

char

* path,

const

char

* arg,..

.)path: 帶路徑的可執行程式,絕對或相對路徑

arg: 給可執行程式傳遞的引數,規定:第乙個引數必須是可執行程式的名稱..

.: 可變引數列表,引數列表要以 null 標誌引數結束

l :可變引數列表的函式,引數列表要以 null 標誌引數結束

int

execlp

(const

char

* file,

const

char

* arg,..

.)file: 可執行檔案的名稱,可執行程式是必須在環境變數 path 當中可以找到的,也可以直接傳入可執行程式的絕對路徑

p :如果帶 p,要替換的程式可以直接給乙個程式的名稱,回去搜尋當前環境變數

int

execle

(const

char

* path,

const

char

* arg,..

.,char

* consst envp)

envp: 給當前所要替換的程式設定環境變數,要以 null 結尾

e :如果帶有 e,則需要自己去組織環境變數的內容

int

execv

(const

char

* path,

const

char

* ar**)

ar**: 傳入字元陣列指標,而不是可變引數列表

v :如果帶有 v,則表示需要傳入的程式命令列引數為字元陣列指標,而不是可變引數列表,字元陣列依舊需要以 null 結尾

其中,系統呼叫為 execve,其他的為庫函式

守護程序

基本具備的條件:server 可執行程式,守護程序的程式

守護程序是由守護程式啟動的,在守護程序當中,使用到了建立子程序+程序程式替換+程序間通訊(判斷子程序是否執行正常)

獲取狀態發現 server 可執行程式並沒有更改,則認為 server 狀態異常,執行策略就是重新建立子程序,讓子程序程式替換,替換為新的 server 可執行程式

server 可執行程式:通過程序間通訊,每隔一段時間告訴父程序當前的狀態

shell終端

1.啟動 bash 可執行程式

2.當使用者輸入命令時,建立子程序,子程序程序程式替換

3.在子程序程序程式替換時,如果是前台程序,則 bash 負責程序等待

替換程序exec

1 exec函式族 讓父子程序執行不相干的操作 能夠替換程序位址空間的源 txt 段 當前程式中呼叫另外乙個應用程式 首先想到 exec 之前需要 fork 返回值 如果函式執行成功,不返回 不如執行失敗,列印錯誤資訊,退出當前程序 1 實現換核不換殼功能 2 執行乙個另外的程式不需要建立額外的位址...

程序替換和exec函式族

fork 建立的子程序一般不會執行和父程序相同的 段,而是呼叫exec相關函式,將該程序的使用者空間 和資料完全替換,子程序從替換的新程式啟動執行。exec僅僅是替換 和資料,並不會建立新程序,所以被替換的程序 id 和子程序 id 相等。如下圖 新程序從呼叫程序繼承了下列屬性 exec函式族 函式...

Linux 程序中的替換函式(exec)

摘要 本文主要講述如何在程序中執行新 以及exec系列函式的基本使用方法.在程序中執行新 用函式fork建立子程序後,如果希望在當前子程序中執行新的程式,可以呼叫exec函式執行另乙個程式.當程序呼叫exec函式時,該程序使用者空間資源 正文 資料 堆和棧 完全由新程式替代,新程式則從main函式開...