exec提供了一種在進程中啟動另外一個程式的執行的方法。它可以根據指定的檔案名稱或目錄名找到可執行檔,並用它來取代原調用進程的資料區段、程式碼片段和堆棧段。在執行完之後,原調用進程的內容除了進程號外,其他全部都被替換了。
1.可執行檔尋找方式
exec族中的函數以p結尾的函數可以只給出檔案名稱,系統會自動從環境變數“$PATH”所包含的路徑中進行尋找。
即 結尾不是p的,必須要給出檔案的路徑,並且最後的參數為NULL;
2.參數表傳遞方式
兩種方式:逐個列舉或是將所有參數通過指標數組傳遞。
以函數名的第五位字母來區分,字母為“l”(list)的表示逐個列舉的方式;
字母“v”(vertor)的表示將所有參數構造成指標數組傳遞;
3.環境變數的使用
exec函數族可以預設使用系統的環境變數,也可以傳入指定的環境變數。這裡,以“e”(Environment)結尾的兩個函數可以 envp[]中傳遞當前進程所使用的環境變數。
exec(1,2,3....,最後個參數)
exec族中,第一個參數為要執行程式的路徑。
第二個參數為要執行的程式名稱。
第三個參數為給要執行程式傳遞參數。
最後一個參數為NULL;
例子:
int main ()
{
if(-1 == execle("./exec2","exec2","1.txt",NULL))
{
perror("");
exit(0);
}
}//開啟exec2可執行檔,並將"1.txt"傳遞給exec2中的main函數中的參數中
exit()調用退出處理函數,清理緩衝區,調用exit系統調用,進程結束。
_exit()不清理緩衝區。
利用exec實現shell的模仿 :
#include <stdio.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#define N 64
int main()
{
pid_t pid;
char buf[N];
char *arg[N];
int i = 0;
printf(">");
while (fgets(buf, N, stdin) != NULL)
{
buf[strlen(buf)-1] = 0;
if ((pid = fork()) == -1)
{
perror("fork");
exit(-1);
}
if (pid == 0)
{
arg[i++] = strtok(buf, " ");
do
{
arg[i++] = strtok(NULL, " ");
}while(arg[i-1] != NULL);
if (execvp(arg[0], arg) != -1)
{
perror("execvp");
exit(0);
}
}
else
{
wait(NULL);
printf(">");
}
}
exit(0);
}