在linux程式中,通過呼叫execve(),程序能夠以全新程式來替換當前執行的程式。再次過程中,將丟棄舊有程式,程序的棧.資料以及堆段會被新程式所替換。這個 exec 函式族就提供了乙個在程序中啟動另乙個程式執行的方法。
它根據指定的檔名或目錄名找到可執行檔案,並用它來代替當前程序的執行映像。也就是說,exec呼叫並沒有生成新程序,乙個程序一旦呼叫 exec函式,它本身就「死亡」了,系統把**段替換成新程式的**,放棄原有的資料段和堆疊段,並為新程式分配新的資料段與堆疊段,惟一保留的就是程序的 id。也就是說,對系統而言,還是同乙個程序,不過執行的已經是另外乙個程式了。
execve()函式原型
#include
int execve(const
char *filename, char *const argv,
char *const envp);
filename:包含準備載入當前程序空間的新程式的路徑名。既可以是絕對路徑,又可以是相對路徑。
argv:指定了傳給新程序的命令列引數,該陣列對應於c語言main函式的argv引數陣列,格式也相同,argv[0]對應命令名,通常情況下該值與filename中的basename(就是絕對路徑的最後乙個)相同。
envp:最後乙個引數envp指定了新程式的環境列表。引數envp對應於新程式的environ陣列。
t_execve.c
#include
#include
#include
#include
#include
int main(int argc,char * argv);
argvec[0]=argv[0];
argvec[1]=argv[1];
argvec[2]="引數1";
執行t_execve程式,會呼叫execve()函式,函式將會呼叫程序argv[1],也就是呼叫envargs,並將自己的環境變數,引數傳遞給他。我們發現,printf(「the progress can』t to here\n」); 永遠不會被執行(除非呼叫execve()失敗),因為呼叫execve(),會轉到新的程序,自己會被「殺死」;
執行t_execve2程式,fork()之後,子程序會呼叫execve()函式,而父程序會等待子程序退出(也就是等待envargs2退出)。我們發現:執行新程式保持了原來程序的程序 id、父程序id、實際使用者 id 和實際組 id。同時還可以看到,當呼叫新的可執行程式後,原有的子程序的映像被替代,不再被執行。
執行新程式後的程序除了保持原來的程序 id、父程序 id、實際使用者 id 和實際組 id 之外,程序還保持了許多原有的特徵,主要有:
當前工作目錄
根目錄
建立檔案時使用的遮蔽字
程序訊號遮蔽字
未決警告
和程序相關的使用處理器的時間
控制終端
檔案鎖
有 6 個以 exec 開頭的函式族,他們之間的語法有細微的差別,函式原型如下所示:
實際上有關exec是乙個函式族,包括execle,execlp,execvp,execv,execl但是他們具體的實現都是呼叫execve()之上。它們的區別就在於對路徑名,引數以及環境變數的指定上。下面分別從這三個方面來區分這幾個函式:
- 路徑名:帶p的表示可以通過環境變數path去查詢,所以我們可以不用絕對路徑,比如execlp和execvp就可以直接用filename。
- 引數:帶l的execle()和execlp()以及execl()要求在呼叫中以字串形式指定引數。首個引數相當於新程式main中的argv[0],因而通常與filename中的basename相同(就是絕對路徑的最後乙個)。
- 環境變數:以e結尾的允許我們通過envp為新程式顯式的指定環境變數,其中envp必須以null結尾。
Linux程序執行緒學習筆記 執行新程式
所以,要執行乙個新程式,需要最基本的兩步 1,建立乙個可執行程式的環境,也就是程序。2,將環境中的內容替換成你所希望的,也就是用你希望執行的可執行檔案去覆蓋新程序中的原有映像,並從該可執行檔案的起始處開始執行。exec是一族函式的簡稱,包含在中它們作用都一樣,用乙個可執行檔案覆蓋程序的現有映像,並轉...
linux程式後台執行
方法 1在終端輸入命令 pso pso.file 2 1 解釋 將 pso直接放在後台執行,並把終端輸出存放在當前目錄下的 pso.file 檔案中。當客戶端關機後重新登陸伺服器後,直接檢視 pso.file 檔案就可看執行結果 命 令 cat pso.file 方法 2在終端輸入命令 nohup....
linux程式執行步驟
作業系統建立程序,把控制權交給程式的入口 往往是執行庫中的某個入口函式 入口函式對執行庫和程式執行環境進行初始化 包括堆 i o 執行緒 全域性變數構造等等 入口函式初始化後,呼叫 main 函式,正式開始執行程式主體部分。main 函式執行完畢後,返回到入口函式進行清理工作 包括全域性變數析構 堆...