Linux 程序控制之程式替換的理解

2021-10-25 02:20:26 字數 1644 閱讀 1305

程序程式替換:替換乙個程序,排程執行其它程式。

替換原理:替換的是當前子程序的資料段和**段

產生現象:

子程序pid不發生改變。

替換成功之後,執行的是替換之後的程式,輸出的內容也和之前的程式無關

不再執行原程序中的**

替換函式:五個exec開頭的函式

#include

int execl(const char *path,const char *arg,…)

int execlp(const char *path,const char *arg,…)

int execle(const char *path,const char *arg,…,char *const envp)

int execv(const char *path,char *const ar**)

int execvp(const char *file,char *const ar**)

這五個函式都可以載入乙個新的程式到記憶體中,將當前pcb對映到這個新的程式中,排程執行這個新的程式執行。

函式之間的區別:

帶l:引數列表可變

帶v:當前函式以字元指標陣列方式進行傳遞引數。

帶p:搜尋環境變數path來查詢替換的程式

不帶p:不會搜尋環境變數,需要自己指定替換程式的路徑

帶e:需要自己組織環境變數

不帶e:使用系統環境變數

這5個函式是庫函式提供的介面。它們都會呼叫系統函式介面:

int execve(const char *path,char *const arr**,char *const envp)

示例:帶 l 函式

結果為:

示例:帶 v 函式

結果為:

由上述的兩個小示例可以看出:

程式替換後,不再執行原程序的程式。

函式名引數格式

是否帶路徑

是否使用環境變數

execl列表是

是execlp列表否

是exexle列表是

否execv

字元指標陣列是是

execvp

字元指標陣列否是

execve

字元指標陣列是否

在命令列中啟動程式,就是命令列直譯器(bash),建立子程序,並且讓子程序進行程序程式替換為啟動的程序。

即:命令列中啟動的程式,其父程序是bash。

Linux程序控制 程序替換

使用fork建立的程序和父程序執行的相同的程式 執行不同的 分支 子程序需要執行其他程式需要通過exec函式進行程序替換執行另乙個程式。替換函式 exec函式總共有六個 int execl const char path,const char arg,int execlp const char fi...

Linux程序控制 2 程序等待 程式替換

我們知道,子程序先退出,父程序如果不管不顧,就會導致殭屍程序,進而造成資源洩漏等嚴重問題 一旦產生殭屍程序,殺人不眨眼 的kill 9也無能為力,因為沒有辦法殺死乙個已經僵死的程序 那麼如何避免產生殭屍程序呢?父程序通過程序等待的方式,子程序資源,獲取子程序退出資訊 這裡先說一下阻塞和非阻塞 阻塞 ...

程序控制 程序建立 程序終止 程序等待 程式替換

程序建立 fork vfork vfork 的子程序不能在main函式中return退出 fork 和 vfork clone 同樣可以建立程序或者執行緒,它的引數更多,功能更強大 在核心中都是呼叫 do fork 實現程序的建立,只是引數不同 fork 要建立 pcb,虛擬位址空間,頁表 程序終止...