exec函式組
在fork後的子程序中使用exec函式族,可以裝入和執行其它程式(子程序替換原有程序,和父程序做不同的事)。
fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被 exec 執行的程序的pid不會改變(和呼叫exec的程序的pid一樣)。
在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 argv);
int execvp(const char *file, char *const argv);
int execve(const char *path, char *const argv, char *const envp);
其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。
字尾操作能力
l希望接收以逗號分隔的引數列表,列表以null指標作為結束標誌
v希望接收到乙個以null結尾的字串陣列的指標
p是乙個以null結尾的字串陣列指標,函式可以dos的path變數查詢子程式檔案
e函式傳遞指定引數envp,允許改變子程序的環境,無字尾e時,子程序使用當前程式的環境
execv開頭的函式是以"char *argv"(vector)形式傳遞命令列引數,而execl開頭的函式採用了羅列(list)的方式,把引數乙個乙個列出來,然後以乙個null表示結束
。這裡的null的作用和argv陣列裡的null作用是一樣的.
除 execlp和execvp之外的4個函式都要求,它們的第1個引數path必須是乙個完整的路徑,如"/bin/ls";而execlp和execvp 的第1個引數file可以僅僅只是乙個檔名,如"ls",這兩個函式可以自動到環境變數path指定的目錄裡去查詢。
字母e是指給可執行檔案指定環境變數。在全部6個函式中,只有execle和execve使用了char *envp傳遞環境變數,其它的4個函式都沒有這個引數,這並不意味著它們不傳遞環境變數,這4個函式將把預設的環境變數不做任何修改地傳給被執行的應用程式。而execle和execve用指定的環境變數去替代預設的那些。
返回值:
exec函式族的函式執行成功後不會返回
,。呼叫失敗時,會設定errno並返回-1,然後從原程式的呼叫點接著往下執行
。如果乙個程序想執行另乙個程式,它就可以fork或vfork出乙個新程序,然後呼叫任何乙個exec函式。
為此,linux還專門對fork作了優化:通常fork會將呼叫程序的所有內容原封不動的拷貝到新產生的子程序中去,這些拷貝的動作很消耗時 間,而如果fork完之後我們馬上就呼叫exec,那這些辛辛苦苦拷貝來的東西就會被立刻抹掉,這看起來非常不划算,於是人們設計了一種"寫時複製(copy-on-write)" 技術,使得fork結束後並不立刻複製父程序的內容到子程序,而是到了真正使用時才複製,這樣如果下一條語句是exec,它就不會作無用功了。其實"寫時 複製"還是有複製,程序的mm結構、頁表都還是被複製了("寫時複製"也必須由這些資訊來支撐。否則核心捕捉到cpu訪存異常,怎麼區分 這是「寫時複製」引起的,還是真正的越權訪問呢?)。
而vfork就把事情做絕了,所有有關於記憶體的東西都不複製了,父子程序的記憶體是完全共享的。 但是這樣一來又有問題了,雖然使用者程式可以設計很多方法來避免父子程序間的訪存衝突。但是關鍵的一點,父子程序共用著棧,這可不由使用者程式控制的。乙個進 程進行了關於函式呼叫或返回的操作,則另乙個程序的呼叫棧 (實際上就是同乙個棧)也被影響了。這樣的程式沒法執行下去。所以,vfork有個限制,子程序生成後,父程序在vfork中被核心掛起,直到子程序有了 自己的記憶體空間(exec**)或退出(_exit)。並且, 在此之前,子程序不能從呼叫vfork的函式中返回(同時,不能修改棧上變數、不能繼續呼叫除_exit或exec系列之外的函式,否則父程序的資料可能 被改寫)。
儘管限制很多,vfork後馬上exec效率會比fork高不少。
liunx中exec函式組
1 簡介 在linux中,並不存在exec 函式,exec指的是一組函式,一共有6個,分別是 include extern char environ int execl const char path,const char arg,int execlp const char file,const c...
exec系列函式的原理及用法
用exec函式進行程序替換 在多程序程式設計下,用函式封裝,其所有的子程序做的事情基本相同 程序替換後,建立出子程序,子程序根據條件呼叫新的程式檔案,呼叫成功後,原程式將不再繼續執行,示例如下 上圖在子程式中通過exec替換新的 從而執行新的程式檔案。exec系列函式格式 int execl cha...
exec 命令的用法
shell的內建命令exec將並不啟動新的shell,而是用要被執行命令替換當前的shell程序,並且將老程序的環境清理掉,而且exec命令後的其它命令將不再執行。因此,如果你在乙個shell裡面,執行exec ls那麼,當列出了當前目錄後,這個shell就自己退出了,因為這個shell程序已被替換...