當程序呼叫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族函式。程式替換函式 程式替...