fork 建立子程序後執行的是和父程序相同的程式(但有可能執行不同的**分支),子程序往往要呼叫一種 exec 函式以執行另乙個程式。當程序呼叫一種 exec 函式時,該程序的使用者空間**和資料完全被新程式替換,從新程式的啟動例程開始執行。呼叫 exec 並不建立新程序,所以呼叫 exec 前後該程序的 id 並未改變。
將當前程序的.text、.data 替換為所要載入的程式的.text、.data,然後讓程序從新的.text 第一條指令開始執行,但程序 id 不變,換核不換殼。
描述執行乙個檔案;
實質:在乙個程序中,替換使用者空間(0-3g)資料,並執行另乙個程序;
標頭檔案
#include
函式簽名int
execl
(const
char
*path,
const
char
*arg,..
./* (char *) null */);
intexeclp
(const
char
*file,
const
char
*arg,..
./* (char *) null */
);
引數
path:
要執行的可執行程式的路徑;
*arg:
從第二個引數開始填寫,要執行的程式的主函式引數,從ar**[0](該程序名)開始填寫,以null表示主函式引數傳完了;
eg:
自定義檔案 print.c,編譯後呼叫:./print hello world,將會列印hello world;
// 檔案路徑 print檔案主函式ar**[0] ar**[1] ar**[2]
execl
("./print"
,"./print"
,"hello"
,"world"
,null
);
返回值
只有失敗才會返回 -1;
學習筆記
execl和execlp的區別:
execl 一般執行自定義的檔案,path指定相對或絕對路徑(完整),不指定完整路徑會找到不到;
execlp一般執行系統檔案(指令),eg:ls、date、cp、cat 等命令,ls,只要指定 ls(命令即可),因為execlp會呼叫 path環境變數,去環境變數下查詢檔案;
exec函式族:
一般fork乙個子程序,是為了執行exec函式族的函式(新的程式的資料會替換舊的程式的0-3g的使用者區資料); 示例
execlp執行ls
#include
#include
#include
intmain
(int argc,
char
*ar**)
sleep(1
);/* 父程序邏輯 */
return0;
}
execl執行自定義檔案
#include
#include
#include
intmain
(int argc,
char
*ar**)
sleep(1
);/* 父程序邏輯 */
return0;
}
print.c
#include
intmain
(int argc,
char
*ar**)
printf
("%s %s\n"
, ar**[1]
, ar**[2]
);return0;
}
exec 函式一旦呼叫成功即執行新的程式,不返回;
只有失敗才返回,錯誤值-1;
所以通常我們直接在exec 函式呼叫後直接呼叫 perror()和 exit(),無需 if 判斷;
事實上,只有 execve 是真正的系統呼叫,其它五個函式最終都呼叫 execve;
所以 execve 在 man 手冊第 2 節,其它函式在 man 手冊第 3 節;
這些函式之間的關係如下圖所示:
Linux中exec族函式詳解
1 exec函式說明 fork函式是用於建立乙個子程序,該子程序幾乎是父程序的副本,而有時我們希望子程序去執行另外的程式,exec函式族就提供了乙個在程序中啟動另乙個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案,並用它來取代原呼叫程序的資料段 段和堆疊段,在執行完之後,原呼叫程序的內容...
Linux 程序 exec函式族
其他exec 函式 練習拓展dup2 dup to 函式 一 exec的簡介 1.fork建立程序後執行的是和父程序相同的程式 但有可能執行不同的 分支 子程序往往要呼叫一種exec函式執行另一種程式。當程序呼叫一種exec函式時,該程序的使用者空間 和資料完全被新程式替換,從新程式的啟動例程開始執...
Linux程序 exec族函式
1 為什麼要使用exec族函式 當我們fork乙個子程序就是為了執行乙個新的程式,此時可以呼叫exec族函式,執行已經編譯好的可執行程式或者linux自帶的ls cd等命令。2 exec族函式如何使用 函式原型 include extern char environ intexecl const c...