当前位置: 技术问答>linux和unix
在linux中vfork的exec问题
来源: 互联网 发布时间:2017-05-28
本文导语: 今天在复习进程中,使用vfork创建子进程,并且在子进程中调用exec函数,但是结果是先执行子进程,然后执行父进程,在打印exec的内容。 我有几个不明白的地方: 1.书上说vfork函数后子进程和父进程是公用一个内存...
今天在复习进程中,使用vfork创建子进程,并且在子进程中调用exec函数,但是结果是先执行子进程,然后执行父进程,在打印exec的内容。
我有几个不明白的地方:
1.书上说vfork函数后子进程和父进程是公用一个内存空间,那么exec会覆盖进程的代码段,数据段和堆栈段,那不是连父进程也一起改变了。
2.我在调用exec程序后,当前进程一直在挂起,不会随exec执行结束后结束,当按任意数回车,会显示错误。
下面是执行结果
代码:fd = vfork();
if(fd > 0)
{
printf("Here is father and child is %dn",fd);
//waitpid(fd,&status,0);
}
if(fd == 0)
{
printf("Here is childn");
execl("/home/zjc/process/localtime","hello",(char*)0);
}
我有几个不明白的地方:
1.书上说vfork函数后子进程和父进程是公用一个内存空间,那么exec会覆盖进程的代码段,数据段和堆栈段,那不是连父进程也一起改变了。
2.我在调用exec程序后,当前进程一直在挂起,不会随exec执行结束后结束,当按任意数回车,会显示错误。
下面是执行结果
代码:fd = vfork();
if(fd > 0)
{
printf("Here is father and child is %dn",fd);
//waitpid(fd,&status,0);
}
if(fd == 0)
{
printf("Here is childn");
execl("/home/zjc/process/localtime","hello",(char*)0);
}
|
vfork之后父进程与子进程共享同一个地址空间,并且父进程挂起等待子进程先执行.
一但子进程执行了execl, 父子进程的地址空间就不再共享了,父进程也不再会挂起
所以在子程执调用execl之后,父进程比子进程先执行完了,子进程成了init接管的孤儿进程,这时子进程在后台进程组.
后台进程组的进程打印printf的内容就会像你说的好像挂起了一样,必须按回车才能回到提示符
一但子进程执行了execl, 父子进程的地址空间就不再共享了,父进程也不再会挂起
所以在子程执调用execl之后,父进程比子进程先执行完了,子进程成了init接管的孤儿进程,这时子进程在后台进程组.
后台进程组的进程打印printf的内容就会像你说的好像挂起了一样,必须按回车才能回到提示符
|
你的程序执行过程应该是这样的:
vfork创建子进程,首先执行的子进程:1、打印Here is child,2、调用exec函数再创建一个进程,之后子进程结束退出。马上父进程执行1、打印Here is father and child is 4444,2、退出后shell打印提示符。这期间exec创建的子进程还未执行,而且父进程没有调用wait函数(楼主注释掉了)这样父进程先与子进程退出,exec创建的进程成为孤儿进程,会由init进程接管,接着运行exec创建的子进程,输出时间。
vfork创建子进程,首先执行的子进程:1、打印Here is child,2、调用exec函数再创建一个进程,之后子进程结束退出。马上父进程执行1、打印Here is father and child is 4444,2、退出后shell打印提示符。这期间exec创建的子进程还未执行,而且父进程没有调用wait函数(楼主注释掉了)这样父进程先与子进程退出,exec创建的进程成为孤儿进程,会由init进程接管,接着运行exec创建的子进程,输出时间。