Linux程序執行緒學習筆記 執行新程式

2021-07-16 16:49:12 字數 3636 閱讀 4308

所以,要執行乙個新程式,需要最基本的兩步:

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

argv);

int execvp(const char *file, char *const argv);

int execve(const char *

path

, char *const

argv

, char *const

envp

);我們先以最簡單的execl函式為例,其他的大同小異,其第乙個引數path是可執行檔案的路徑,是絕對路徑;從arg0引數開始及後面所有的是你要傳遞給可執行檔案的命令列引數,值得注意的是,arg0是可執行檔案本身(還記得c語言中老師講main函式引數列表時所說的麼),當然,不傳程式本身或傳一些亂七八糟的值並不代表不能通過編譯或不能執行,只不過,如果可執行檔案要用到arg0時會產生一些迷惑;最後有乙個注釋/*, (char*)0 */是提醒我們最後乙個引數應該傳空字串。如何函式執行成功,則不會有任何返回值,否則返回-1,而具體的錯誤號會被設定在errno,errno是乙個全域性變數,用於程式設定錯誤號,跟win32的getlasterror函式類似。 

看下面的例子:

#include 

<

stdio.h

>

#include 

<

unistd.h

>

intmain ()

我們執行了bin目錄下的ls程式,引數arg0時ls程式本身路徑,arg1為-l,使得其以列表的形式列舉當前目錄,在我的計算機上程式輸出如下:

12-rw-r--r-- 

1zhouyh zhouyh  

2732010-09

-0611:

09temp.c

-rwxr-xr-x 

1zhouyh zhouyh 

7175

2010-09

-0611:

09temp.exe

那我們接下來,試著用fork吧,以免影響原程序。

#include 

<

stdio.h

>

#include 

<

unistd.h

>

intmain ()

printf(""

);return0;

} 我們用fork建立了乙個新程序,當其成功建立後(返回值為0),我們用execl來載入ls程式並執行之。

程式的輸出如下:

12-rw-r--r-- 

1zhouyh zhouyh  

2292010-09

-0615:

59temp.c

-rwxr-xr-x 

1zhouyh zhouyh 

7211

2010-09

-0616:

00temp.exe

wait函式講當前程序休眠,直到該程序的某個子程序結束或者有特定的訊號來喚醒。如果子程序正常結束,則講子程序的程序id(pid)作為返回值,發生錯誤則返回-1,而status引數講傳出子程序的結束狀態值。

針對剛才的例子,可以參考下面的**:

#include 

<

stdio.h

>

//for printf(const char)

#include 

<

unistd.h

>

//for fork()

#include 

<

sys/

wait.h

>

//for wait(int* status)

intmain ()

intstatus;

wait(

&status);

printf(""

);return0;

} 程式輸出如下:

12-rw-r--r-- 

1zhouyh zhouyh  

3372010-09

-0616:

22temp.c

-rwxr-xr-x 

1zhouyh zhouyh 

7247

2010-09

-0616:

22 好了,現在回過頭來看除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

argv);

int execvp(const char *file, char *const argv);

int execve(const char *

path

, char *const

argv

, char *const

envp);

這三個函式和前面的三個類似,函式名由字尾l變成了v,其表達的含義是引數不再用引數列表傳遞而是用乙個引數陣列argv,當然,陣列最後乙個元素也必須是char* 0 

名字這麼相近的函式,感覺好容易混淆,那麼就從l,v,p,e 這樣的字尾來區分吧:

l:引數為乙個逗號分隔的引數列表,並以char* 0作為列表結尾

v: 引數為字串陣列,陣列的最後乙個元素為char* 0

p: 可以通過系統環境變數查詢檔案位置

e:呼叫者顯示傳入環境變數 

Linux程序執行緒學習筆記

所以,要執行乙個新程式,需要最基本的兩步 1,建立乙個可執行程式的環境,也就是程序。2,將環境中的內容替換成你所希望的,也就是用你希望執行的可執行檔案去覆蓋新程序中的原有映像,並從該可執行檔案的起始處開始執行。exec是一族函式的簡稱,包含在中它們作用都一樣,用乙個可執行檔案覆蓋程序的現有映像,並轉...

Linux程序執行緒學習筆記 程序建立

linux程序執行緒學習筆記 程序建立 周銀輝各位同學,轉換下思維,這裡說的是 程序 不是 執行緒 ok,我們開始 程序 二字似乎總有那麼些 只可意會不可言傳 的韻味,維基百科是這樣來解釋的 也有朋友如此來闡述,乙個可以執行的程式 和該程序相關聯的全部資料 包括變數,記憶體空間,緩衝區等等 程式的執...

linux 學習筆記 後台程序執行程式

if defined poe os family windows define pathseprator else define pathseprator endif inline string getprocessdir string strdir ifndef win32 可執行檔案所在目錄 i...