一个进程调用exec()函数来运行一个新程序。之后该进程的代码段、数据段和堆栈段就被新程序的所代替。新程序从自己的main()函数开始执行。
一个
简单的exec()调用的例子
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
char *env_list[] = {"USER = kate","PATH = /tmp",NULL};
int main()
{
pid_t pid;
pid = fork();
if(pid < 0)
{
printf("fork error\n");
exit(0);
}
else if(pid == 0)
{
if(execle("/home/acer/workspace/print1","print1","arg1","arg2",(char *)0,env_list) < 0)
printf("execle error\n");
exit(0);
}
if(waitpid(pid,NULL,0) < 0){
printf("WAIT ERROR\n");
exit(0);
}
if((pid = fork()) < 0)
{
printf("fork error\n");
exit(0);
}
else if(pid == 0)
{
if(execlp("/home/acer/workspace/print1","print1","arg1",(char*)0) < 0)
printf("execle error\n");
exit(0);
}
exit(0);
return 0;
}
子进程的可执行文件print1的源码为:
#include <stdio.h>
inr main(int argc,char *argv[])
{
int n;
char * * ptr;
extern char * * environ;
for(n = 0; n < argc; n++)
printf("arg[%d]:%s\n",n,argv[n]);
for(ptr = environ; *ptr != 0; ptr++)
printf("%s\n",*ptr);
exit(0);
}
分析:print1.c是主程序file4.c中exec函数指派的可执行程序的源文件名,将传递给程序的参数和环境变量进行输出。下面是一种可能的结果
程序首先调用了execlp(),传递的参数有可执行程序的路径名、程序所需的参数及程序执行时的环境变量。