进程替换:
使用 fork 函数创建子进程的时候,和父进程执行的是相同的程序。但是实际在我们的期望中,子进程应该是执行和父进程不同的代码。所以此时,子进程往往要调用 exec函数从而执行另一个程序。调用 exec 并不创建新的进程,所以调用 exec 函数并不会改变该进程的 pid。
被替换的用户的代码和数据完全被新的程序替换,并从新的程序的启动例程开始执行。
- exec函数
int exec函数族,只有出错的时候才会有返回值。
path是路径。
argv是main函数传的参数,个数由底层自己算出。
5个库函数底层都是由系统调用实现的。这些函数的名字也是有一定规律的
l (list) : 表示参数使用列表 v (vector) : 参数使用数组
p(path) : 自动搜索环境标量 e(env) :需要自己去维护环境变量
exec.c
int main(int argc,char*argv[],char*envp[])
{
printf("main pid=%d\n",getpid());
//execl("/bin/ps","ps","-f",(char*)0);
//execlp("ps","ps","-f",(char*)0);
//execle("/bin/ps","ps","-f",(char*)0,envp);
char* myargv[10]={"ps","-f"};
char* myenvp[10]={"MYSTR=hello","MYPAHY=/bin"};
//execv("/bin/ps",myargv);
//execvp("ps",myargv);
//execve("/bin/ps",myargv,envp);
//execl("./cy","cy","hello","123",(char*)0);
execle("./cy","cy","hello","123",(char*)0,myenvp);
perror("exec error");
exit(0);
}
cy.c
int main(int argc,char *argv)
{
printf("cy main pid =%d\n",getpid());
printf("argc =%d\n",argc);
int i=0;
for(i=0;i<argc;i++)
{
printf("arv[i]=%s\n",i,argv[i]);
}
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[i]=%s\n",i,envp[i]);
}
}
exec后子进程变成了一个新进程,不再和父进程共享文件描述符。
470

被折叠的 条评论
为什么被折叠?



