函数exec
函数介绍
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[])
- 这几个函数若出错返回-1,成功不返回。
- 这几个函数的区别
- 我们看到这几个函数都是exec开头的,我们以后面几个字母来区别函数。
- 其中l我们可以理解成long的意思,表示传递的参数是一个一个的传递的不是一个字符串数组,可以看到使用这种传递方式后面都有一个可选项(char *)0,这个可选参数表示参数传递的结束。
- 其中e字母表示环境变量的意思,如果没有这个字母表示子进程从父进程继承环境变量,如果有的话我们需要传递一个环境变量。
- 字母v是表示我们传递的参数是一个字符出啊数组,可以用一个二维指针来传递多个字符串。
- p字母表示我们在第一个参数启动的进程中我们指定的程序名是从环境变量PATH中进行寻找的,当没有这个p字母的函数中,我们必须指定绝对路径。
这几个函数的作用便是fork一个子进程后调用这几个函数启动第一个参数指定的程序名,来充填子进程的资源。
下面我们使用一个例子来进行介绍这几个函数
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;
}
运行结果
root@ubuntu:/home/sun/project/8# ./exec
sun
jin
song
user=unkown
PATH=/tmp
我们使用exec.c程序来调用echoall.c程序,使用exec.c传递给echoall.c环境变量和参数,使用echoall.c进行输出。
网友评论