考虑以下代码:
int main()
{
int pid;
pid=vfork();
if(pid==0)
printf("child\n");
else
printf("parent\n");
return 0;
}
如果 vfork(),父进程和子进程使用的地址空间相同,那么变量pid的单个副本应该在那里。现在我无法理解这个pid变量如何有两个由 vfork()返回的值,即对于子项为零而对于父项为非零?
如果 fork(),地址空间也会被复制,每个子节点和父节点中都有两个pid变量副本,所以在这种情况下我可以理解两个不同的副本可以有不同的值由 fork()返回,但在 vfork()的情况下无法理解pid如何通过 vfork()返回两个值?
答案 0 :(得分:6)
没有2份。当你对孩子做出事情时(vfork
或_exit(2)
),父母会execve(2)
来冻结父母。所以在任何一个时刻,只有一个pid
变量。
作为旁注,你所做的是不安全的。 The standard明确说明:
vfork()函数应该等同于fork(),除了之外 行为未定义如果由vfork()创建的进程也是如此 修改除用于存储的pid_t类型的变量之外的任何数据 来自vfork()的返回值,或者从其中返回的函数返回 成功之前调用了vfork()或调用任何其他函数 调用_exit()或exec系列函数之一。
作为第二个附注,vfork
已从SUSv4
中移除 - 使用它确实没有意义。