多執行緒 exec族函式

2021-10-06 12:19:35 字數 2044 閱讀 8420

exec族的組成在linux中,並不存在乙個exec()的函式形式,exec指的是一組函式,一共有6個,分別是:

#include

extern char **environ;

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 execve(const char *path, char *const ar**, char *const envp);

其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。

exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。這裡的可執行檔案既可以是二進位制檔案,也可以是任何linux下可執行的指令碼檔案。

與一般情況不同,exec函式族的函式執行成功後不會返回,因為呼叫程序的實體,包括**段,資料段和堆疊等都已經被新的內容取代,只留下程序id等一些表面上的資訊仍保持原樣,頗有些神似"三十六計"中的"金蟬脫殼"。看上去還是舊的軀殼,卻已經注入了新的靈魂。只有呼叫失敗了,它們才會返回乙個-1,從原程式的呼叫點接著往下執行。

我們應該明白了,linux下是如何執行新程式的,每當有程序認為自己不能為系統和使用者做出任何貢獻了,他就可以發揮最後一點餘熱,呼叫任何乙個exec,讓自己以新的面貌重生;或者,更普遍的情況是,如果乙個程序想執行另乙個程式,它就可以fork出乙個新程序,然後呼叫任何乙個exec,這樣看起來就好像通過執行應用程式而產生了乙個新程序一樣。

事實上第二種情況被應用得如此普遍,以至於linux專門為其作了優化,我們已經知道,fork會將呼叫程序的所有內容原封不動的拷貝到新產生的子程序中去,這些拷貝的動作很消耗時間,而如果fork完之後我們馬上就呼叫exec,這些辛辛苦苦拷貝來的東西又會被立刻抹掉,這看起來非常不划算,於是人們設計了一種"寫時拷貝(copy-on-write)"技術,使得fork結束後並不立刻複製父程序的內容,而是到了真正實用的時候才複製,這樣如果下一條語句是exec,它就不會白白作無用功了,也就提高了效率。

對於新程式的命令列引數和環境表有長度大小的限制,對於linux來講這個限制是4096個位元組。執行了exec函式的程序不改變以下程序特徵:

1> 程序id和父程序id

2> 實際使用者id和實際組id

3> 程序組id和附加組id

4> 控制終端

5> 會話id

6> 時鐘預留著時間

7> 當前工作目錄和根目錄

8> 檔案建立遮蔽字和檔案鎖

9> 訊號遮蔽字和未處理訊號集

10> 資源限制

如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

在平時的程式設計中,如果用到了exec函式族,一定記得要加錯誤判斷語句。因為與其他系統呼叫比起來,exec很容易受傷,被執行檔案的位置,許可權等很多因素都能導致該呼叫的失敗。

最常見的錯誤是:

1.找不到檔案或路徑,此時errno被設定為enoent;

2.陣列ar**和envp忘記用null結束,此時errno被設定為efault;

3.沒有對要執行檔案的執行許可權,此時errno被設定為eacces。

l 表示以引數列表的形式呼叫

v 表示以引數陣列的方式呼叫

e 表示可傳遞環境變數

p 表示path中搜尋執行的檔案,如果給出的不是絕對路徑就會去path搜尋相應名字的檔案,如path沒有設定, 則會預設在/bin,/usr/bin下搜尋。

另:呼叫時引數必須以null結束。原程序開啟的檔案描述符是不會在exec中關閉的,除非用fcntl設定它們的「執行時關閉標誌(close on exec)」而原程序開啟的目錄流都將在新程序中關閉。

exec函式族筆記

include extern char environ int execl const char path,const char arg,int execv const char path,char const argv int execle const char path,const char a...

exec族函式總結

1 execve為系統呼叫 其他的都是封裝的函式 l 引數列表 p 在環境變數path中尋找 v 引數陣列 e 替換環境變數列表 返回值 函式出錯 返回0 否則不反回 原來的使用者區已經被替換 只留下pcb所以沒有返回的地方 exec族函式只替換使用者區 但是對核心區的pcb也有一定的影響 詳見 a...

exec函式族小結

本人最近了解了關於exec函式族相關的知識,在此進行一下總結。fork函式是用於建立乙個子程序,該子程序幾乎是父程序的副本。而當我們希望子程序去執行另外的程式時,exec函式族就提供了乙個在程序中啟動另乙個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案 這裡的可執行檔案既可以是二進位制檔...