所以,要執行乙個新程式,需要最基本的兩步:
1,建立乙個可執行程式的環境,也就是程序。
2,將環境中的內容替換成你所希望的,也就是用你希望執行的可執行檔案去覆蓋新程序中的原有映像,並從該可執行檔案的起始處開始執行。
exec是一族函式的簡稱,包含在中它們作用都一樣,用乙個可執行檔案覆蓋程序的現有映像,並轉到該可執行檔案的起始處開始執行。
原型如下:
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
int execle(const char *path, const char *arg0, ... /*, (char *)0, 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);
我們先以最簡單的execl函式為例,其他的大同小異,其第乙個引數path是可執行檔案的路徑,是絕對路徑;從arg0引數開始及後面所有的是你要傳遞給可執行檔案的命令列引數,值得注意的是,arg0是可執行檔案本身(還記得c語言中老師講main函式引數列表時所說的麼),當然,不傳程式本身或傳一些亂七八糟的值並不代表不能通過編譯或不能執行,只不過,如果可執行檔案要用到arg0時會產生一些迷惑;最後有乙個注釋/*, (char*)0 */是提醒我們最後乙個引數應該傳空字串。如何函式執行成功,則不會有任何返回值,否則返回-1,而具體的錯誤號會被設定在errno,errno是乙個全域性變數,用於程式設定錯誤號,跟win32的getlasterror函式類似。
看下面的例子:
#include
#include
int main ()
我們執行了bin目錄下的ls程式,引數arg0時ls程式本身路徑,arg1為-l,使得其以列表的形式列舉當前目錄,在我的計算機上程式輸出如下:
total 12
-rw-r--r-- 1 zhouyh zhouyh 273 2010-09-06 11:09 temp.c
-rwxr-xr-x 1 zhouyh zhouyh 7175 2010-09-06 11:09 temp.exe
那我們接下來,試著用fork吧,以免影響原程序。
#include
#include
int main ()
return 0;
}
我們用fork建立了乙個新程序,當其成功建立後(返回值為0),我們用execl來載入ls程式並執行之。
程式的輸出如下:
zhouyh@ubuntu:~/documents$ total 12
-rw-r--r-- 1 zhouyh zhouyh 229 2010-09-06 15:59 temp.c
-rwxr-xr-x 1 zhouyh zhouyh 7211 2010-09-06 16:00 temp.exe
wait函式講當前程序休眠,直到該程序的某個子程序結束或者有特定的訊號來喚醒。如果子程序正常結束,則講子程序的程序id(pid)作為返回值,發生錯誤則返回-1,而status引數講傳出子程序的結束狀態值。
針對剛才的例子,可以參考下面的**:
#include //for printf(const char)
#include //for fork()
#include //for wait(int* status)
int main ()
int status;
wait(&status);
return 0;
}
程式輸出如下:
total 12
-rw-r--r-- 1 zhouyh zhouyh 337 2010-09-06 16:22 temp.c
-rwxr-xr-x 1 zhouyh zhouyh 7247 2010-09-06 16:22 temp.exe
好了,現在回過頭來看除execl外的其他幾個函式 :
int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
execlp和execl差不多,但區別在於前者會去系統環境變數查詢file所指的程式的位置,所以如果通過環境變數能找到可執行檔案,則file可以不是絕對路徑了,比如 execlp("ls", "ls", "-l", null);
int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/);
與execlp不同的是,其最後乙個引數作為你自定義的環境變數引數傳進去,而不是查詢系統環境變數
char *env = ;
execle("/bin/ls", "ls", "-l", null, env);
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);
這三個函式和前面的三個類似,函式名由字尾l變成了v,其表達的含義是引數不再用引數列表傳遞而是用乙個引數陣列ar**,當然,陣列最後乙個元素也必須是char* 0
名字這麼相近的函式,感覺好容易混淆,那麼就從l,v,p,e 這樣的字尾來區分吧:
l:引數為乙個逗號分隔的引數列表,並以char* 0作為列表結尾
v: 引數為字串陣列,陣列的最後乙個元素為char* 0
p: 可以通過系統環境變數查詢檔案位置
e:呼叫者顯示傳入環境變數
Linux程序執行緒學習筆記 程序建立
linux程序執行緒學習筆記 程序建立 周銀輝各位同學,轉換下思維,這裡說的是 程序 不是 執行緒 ok,我們開始 程序 二字似乎總有那麼些 只可意會不可言傳 的韻味,維基百科是這樣來解釋的 也有朋友如此來闡述,乙個可以執行的程式 和該程序相關聯的全部資料 包括變數,記憶體空間,緩衝區等等 程式的執...
Linux程序執行緒學習筆記 執行新程式
所以,要執行乙個新程式,需要最基本的兩步 1,建立乙個可執行程式的環境,也就是程序。2,將環境中的內容替換成你所希望的,也就是用你希望執行的可執行檔案去覆蓋新程序中的原有映像,並從該可執行檔案的起始處開始執行。exec是一族函式的簡稱,包含在中它們作用都一樣,用乙個可執行檔案覆蓋程序的現有映像,並轉...
python學習筆記 程序和執行緒
對於作業系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序,開啟乙個記事本就啟動了乙個記事本程序,開啟兩個記事本就啟動了兩個記事本程序,開啟乙個word就啟動了乙個word程序。有些程序還不止同時幹一件事,比如word,它可以同時進行打字 拼寫檢查 列印等事情。...