第五十九章、linux的系統調用之exec的6種不同使用格式

經過前幾章的瞭解我們對進程的創建和結束有了瞭解。

那麼我們知道fork函數創建的進程只是將父進程的環境複製到新進程中,而沒有用新程序來初始化創建的子進程,因此,它並不能執行一個新的目標程序,而這一點又是程序設計時所必須的,為此linux系統提供了exec系統調用。

exec函數有6種不同的使用格式,但是內核中只對應一個入口,不同之處在於不同格式有不同的名字和調用函數,這6種調用在頭文件unistd.h中,格式如下:

int execl (const char *__path, const char *__arg, ...)

int execv (const char *__path, char *const __argv[])

int execle (const char *__path, const char *__arg, ...)

int execve (const char *__path, char *const __argv[], char *const __envp[])

int execlp (const char *__file, const char *__arg, ...)

int execvp (const char *__file, char *const __argv[])

上面的參數path指出一個可執行目標文件的路徑名,參數file指出可執行目標文件的文件名,arg作為約定,同path一樣指出目標文件的路徑名,參數argv是一個字符指針數組,由它指出該目標程序使用的命令行參數表,按約定第一個字符指針指向與path或file相同的字符串,最後一個envp與argv一樣也是一個字符指針數組,由它指出該目標程序執行是的進程環境,它也以一個空指針結束。

調用成功時exec不返回,從而不執行exec以後的所有語句,失敗時返回-1;

exec的6種格式在以下3點上有所不同:

1、 path是一個目標文件的完整路徑名,而file是目標文件名,它可以通過環境變量path來搜索;

2、 有path或file指定的目標文件的命令行參數是完整的參數列表還是通過指針數組argv來給出的;

3、 環境變量是系統自動傳遞還是通過envp傳遞的;

下表說明了exec函數的6種不同格式對以上3點的支持

第五十九章、linux的系統調用之exec的6種不同使用格式

圖1

接下來我們來看一個簡單的例子,來簡單的使用下exec函數:

第五十九章、linux的系統調用之exec的6種不同使用格式

圖2

第五十九章、linux的系統調用之exec的6種不同使用格式

圖3

然後我們再將上圖中的12行的execl換成execlp,會打印出什麼呢?

第五十九章、linux的系統調用之exec的6種不同使用格式

圖4

可以看到exec調用成功了,由此可見execl和execlp這兩個函數可以替換使用,但需注意的是execlp中指定的目標文件名必須在path所定義的某個路徑名之下。


分享到:


相關文章: