Linux中的exec函式族

2021-10-08 11:57:06 字數 2431 閱讀 2333

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