函數(shù)exec
函數(shù)介紹
int execl(const char *pathname,const char *arg0 ,..../* (char*)0 */)
int execv(const char *pathname,char *const argv[])
int execle(const char *pathname,const char *arg0 ,..../* (char*)0,char *const envp[] */)
int execve(const char *pathname,char *const argv[] ,char *const envp[])
int execlp(const char *filename,const char *arg0,..../* char *const envp[]*/)
int execvp(const char *filename,char *const argv[])
- 這幾個函數(shù)若出錯返回-1况增,成功不返回垃僚。
- 這幾個函數(shù)的區(qū)別
- 我們看到這幾個函數(shù)都是exec開頭的俱诸,我們以后面幾個字母來區(qū)別函數(shù)瞻赶。
- 其中l(wèi)我們可以理解成long的意思筋讨,表示傳遞的參數(shù)是一個一個的傳遞的不是一個字符串?dāng)?shù)組埃叭,可以看到使用這種傳遞方式后面都有一個可選項(char *)0,這個可選參數(shù)表示參數(shù)傳遞的結(jié)束悉罕。
- 其中e字母表示環(huán)境變量的意思赤屋,如果沒有這個字母表示子進(jìn)程從父進(jìn)程繼承環(huán)境變量立镶,如果有的話我們需要傳遞一個環(huán)境變量。
- 字母v是表示我們傳遞的參數(shù)是一個字符出啊數(shù)組类早,可以用一個二維指針來傳遞多個字符串媚媒。
- p字母表示我們在第一個參數(shù)啟動的進(jìn)程中我們指定的程序名是從環(huán)境變量PATH中進(jìn)行尋找的,當(dāng)沒有這個p字母的函數(shù)中涩僻,我們必須指定絕對路徑缭召。
這幾個函數(shù)的作用便是fork一個子進(jìn)程后調(diào)用這幾個函數(shù)啟動第一個參數(shù)指定的程序名,來充填子進(jìn)程的資源逆日。
下面我們使用一個例子來進(jìn)行介紹這幾個函數(shù)
echoall.c程序
#include"head.h"
int main(int argc,char *argv[])
{
extern char **environ;
int i=0;
for(i=0;i<argc;++i)
{
printf("%s\n",argv[i]);
}
i=0;
while(*(environ+i)!=NULL)
{
printf("%s\n",*(environ+i));
++i;
}
return 0;
}
exec程序
#include"head.h"
char *env_init[]={"user=unkown","PATH=/tmp",NULL};
int main()
{
pid_t pid;
if((pid=fork())<0)
{
printf("creat process error\n");
exit(1);
}
if(pid==0)
{
if(execle("/home/sun/project/8/echoall","sun","jin","song",(char*)0,env_init)<0)
printf("execle error\n");
return 0;
}
if(waitpid(pid,NULL,0)<0)
{
printf("error\n");
return 0;
}
return 0;
}
運(yùn)行結(jié)果
root@ubuntu:/home/sun/project/8# ./exec
sun
jin
song
user=unkown
PATH=/tmp
我們使用exec.c程序來調(diào)用echoall.c程序嵌巷,使用exec.c傳遞給echoall.c環(huán)境變量和參數(shù),使用echoall.c進(jìn)行輸出室抽。