linux程序控制 exec系列

2021-05-24 05:55:53 字數 2469 閱讀 4011

說是exec系統呼叫,實際上在linux中,並不存在乙個exec()的函式形式,exec指的是一組函式,一共有6個,分別是:

#include 

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是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。

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

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

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

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

/* exec.c */

#include

main()

;char *argv_execv=;

char *argv_execvp=;

char *argv_execve=;

if(fork()==0)

if(execl("/bin/echo", "echo", "executed by execl", null)<0)

perror("err on execl");

if(fork()==0)

if(execlp("echo", "echo", "executed by execlp", null)<0)

perror("err on execlp");

if(fork()==0)

if(execle("/usr/bin/env", "env", null, envp)<0)

perror("err on execle");

if(fork()==0)

if(execv("/bin/echo", argv_execv)<0)

perror("err on execv");

if(fork()==0)

if(execvp("echo", argv_execvp)<0)

perror("err on execvp");

if(fork()==0)

if(execve("/usr/bin/env", argv_execve, envp)<0)

perror("err on execve");

}

程式裡呼叫了2個linux常用的系統命令,echo和env。echo會把後面跟的命令列引數原封不動的列印出來,env用來列出所有環境變數。

由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出--各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。

編譯並執行:

$ cc exec.c -o exec

$ ./exec

executed by execl

path=/tmp

user=lei

status=testing

executed by execlp

excuted by execv

executed by execvp

path=/tmp

user=lei

status=testing

Linux程序控制(二)exec

4.執行另乙個程式 exec系列函式 子程序經常要呼叫exec函式執行另乙個程式,程序id不變,exec系列函式有7種 include int execl const char pathname,const char arg0,int execv const char pathname,char c...

Linux程序控制 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...

Linux程序控制 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...