程序 exec函式族

2021-10-03 20:33:26 字數 1774 閱讀 2429

(一)exec函式族

通過呼叫exec函式族實現讓父子程序執行不同的程式,父程序不會受影響。

exec函式族,就是以exec為開頭的函式,比如execl函式、execlp函式等,所以稱它為exec函式族。

l(list) :命令列引數列表

p(path) :搜尋file時的使用的path變數

v(vector向量,載體):使用命令列引數陣列

e(environment) :使用環境變數陣列

注:(1)在exec函式族中,一般fork建立子程序後,執行的是和父程序相同的程式,只是父子程序執行了不同的**分支而已。子程序往往通過呼叫任意乙個exec函式來執行另外乙個程式,當子程序呼叫一種exec函式時,該子程序的使用者空間**和資料完全被新程式替換,並從新程式開始執行。但是呼叫的exec程式並不會建立新程序,所以呼叫exec前後該程序的id並未改變

(2)exec函式族只是用磁碟上的乙個新程式替換了當前程序的正文段、資料段、堆疊和棧段

(二)execl/execlp

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

eg: execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);//null

(1)execl()中的字尾"l"代表list,也就是引數列表的意思。

第一引數path字元指標所指向要執行的檔案路徑(絕對路徑), 接下來的引數代表執行該檔案時傳遞的引數列表:ar**[0],ar**[1]… ,最後乙個引數須用空指標null作結束

int execlp(const char * file,const char * arg,……, null);

eg: execlp(「ls」, 」ls」,」-al」, 」/etc/passwd」, (char *)0);//null

(1)execlp()函式:會從path 環境變數所指的目錄中,查詢符合引數file的檔名, 並執行該檔案。然後將第二個以後的引數當做該檔案的傳參ar**[0]、ar**[1]……, 最後乙個引數必須用空指標(null)作結束。

(2)返回值: 如果執行成功則函式不會返回,執行指定的程式,

執行失敗則直接返回-1, 失敗原因存於errno 中。

(三)execv/execvp

int execv(const char *pathname, char * const ar**);
注:

(1)成功執行指定的程式,失敗返回eof

(2)ar**封裝成指標陣列的形式

eg:

·char * ar**[ ] = ;

if (execv("/bin/ls", ar**) == -1)

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

eg: char * ar**[ ] =;

execvp(「ls」,ar**);

(四) system

int system(char *command);
功 能:可以不替換,執行後面的程式。

實 質:fork了乙個子程序去執行封裝的exec函式

當前程序等待command執行結束後才繼續執行

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...

程序替換和exec函式族

fork 建立的子程序一般不會執行和父程序相同的 段,而是呼叫exec相關函式,將該程序的使用者空間 和資料完全替換,子程序從替換的新程式啟動執行。exec僅僅是替換 和資料,並不會建立新程序,所以被替換的程序 id 和子程序 id 相等。如下圖 新程序從呼叫程序繼承了下列屬性 exec函式族 函式...