#include
#include
#include
void test()
{
pid_t pid;
pid=vfork();
if(pid==-1)
{
perror("vfork");
exit(EXIT_FAILURE);
}
else if(pid==0)
{
printf("1:child pid=%d,ppid=%d\n",getpid(),getppid());
}
else
{
printf("2:parent pid=%d,ppid=%d\n",getpid(),getppid());
}
}
void fun()
{
int buf[100];
for(int i=0;i<100;i++)
{
buf[i]=0;
}
printf("3:child pid=%d,ppid=%d\n",getpid(),getppid());
_exit(0);
}
int main()
{
pid_t pid;
test();
fun();
printf("hello\n");
}
这个问题你只要知道,当你创建了一个新的进程以后,子进程父进程的执行顺序是不确定的就行了!
你可以输出几次试试,结果可能会不一样,另外你在fun函数中循环100次对编译器而言,时间基本可
忽略,你试着在循环中使用printf试试,printf函数很占用资源的。
或者直接sleep几秒。
如有帮助请采纳。
小弟刚开始学习进程相关的知识,为什么在父进程中不执行fun()和println("hello\n");?请各位大佬帮忙解惑!
vfork() 子进程拷贝父进程的数据段和代码段,并且一定是子进程先执行。函数调用是要利用栈进行的,而栈也是数据段的一部分。
所以在test()函数的栈框架内子进程先调用printf()打印,然后退出test()。这里涉及到栈框架的改变。然后调用fun(),在fun()内调用Printf()
之后执行_exit()退出,这里并没有退出fun()的栈框架。然后操作系统切换到父进程,父进程代码段还在test(),而栈框架已经变了。从栈里弹出返回地址就是main()里的Printf()的地址。
函数调用栈具体是什么样的呢:
调用一个函数比如test(),对应的汇编代码:
push `参数`
call test
...
ret
call
这条指令会自动跳转到后面的参数所指定的地址,并且把返回地址压栈,在函数执行完ret
语句会把返回地址弹出到指令指针寄存器,完成函数的返回。
这个可能和环境有关
我这边实验条件:3.13 系统ubuntu14.04
是可以打印的
和if的条件有关系,vfork之后,多出一个子进程并行往下执行,根据不同的if条件,父进程和子进程可以执行不同的代码