Linux 程序替換

2021-09-28 18:27:58 字數 1480 閱讀 9739

當程序呼叫exec函式執行磁碟裡另乙個程式時,並不建立新程序,呼叫前後程序id並未改變,新程序的資料和**會替換掉物理記憶體中的資料段和**段,從而虛擬根據頁表找到的資料和**都會別替換成新的,所以當程序開始執行時,就要從要執行的程式開始執行。

系統呼叫:

int execve(const char* path, char* const ar**, char* const envp);

庫函式:

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, 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**);

int execvpe(const char *file, char *const ar**, char *const envp);

規律:exec必選

v和l必須選其一

e、p可選可不選

如果呼叫成功則載入新的程式從啟動**開始執行,不返回。

如果呼叫出錯則返回-1

演示**:

char

*const ar**=

;char

*const envp=

;// l和v

execl

("/bin/ls"

,"ls"

,"-l"

,null);

execv

("/bin/ls"

, ar**)

;// p和e

execlp

("ls"

,"ls"

,"-l"

,null);

execve

("/bin/ls"

, ar**, envp)

;

這些庫函式在呼叫時候,如果引數採用列**式首先將引數替換成陣列形式,然後如果有相對路徑就在底層替換成絕對路徑,然後根據自己維護的環境變數或者shell的環境變數組織envp,而後調execve介面。

我們發現函式和程序之間有些許相似性:

c語言中,乙個函式和乙個函式可以通過return/call來通訊,這類似與程序間的exit/exec&fork,程序可以fork/exec,並傳給它一些引數。這個被呼叫的程式執行一定的操作,然後通過exit(n)來返回值。呼叫它的程序可以通過wait來獲取exit的返回值。

Linux 訊號,程序替換

概念 軟中斷訊號,用來通知程序發生了非同步事件。系統預先定義好的某些特定事件,訊號可以被傳送,也可以被接受,傳送和接受的主題都是程序。有以下條件可以產生訊號 在linux系統下定義了一些訊號 儲存位置為 乙個程序接收到訊號後的處理 如何修改訊號的響應方式?linux提供了一種系統呼叫 函式位址 si...

Linux程序控制 程序替換

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

Linux程序的程式替換

程式替換 假如作業系統正在執行某乙個程式,我們可以利用程式替換函式指定乙個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork乙個程序,如果fork成功,子程序會和父程序執行相同的 而我們建立子程序是希望子程序執行指定的操作,所以需要執行exec族函式。程式替換函式 程式替...