經過前幾章的瞭解我們對進程的創建和結束有了瞭解。
那麼我們知道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點的支持
接下來我們來看一個簡單的例子,來簡單的使用下exec函數:
然後我們再將上圖中的12行的execl換成execlp,會打印出什麼呢?
可以看到exec調用成功了,由此可見execl和execlp這兩個函數可以替換使用,但需注意的是execlp中指定的目標文件名必須在path所定義的某個路徑名之下。
閱讀更多 C語言學習探討 的文章