6

考虑以下代码:

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()返回的值?

4

1 回答 1

6

没有2份。当您调用vfork父级时,父级冻结而子级执行其操作(直到它调用_exit(2)execve(2))。所以在任何一个时刻,只有一个pid变量。

作为旁注,您正在做的事情是不安全的。标准清楚地说明了这一点:

vfork() 函数应该等效于 fork(),除了如果由vfork () 创建的进程修改了任何数据,而不是用于存储来自 vfork() 的返回值的 pid_t 类型的变量,或者从调用 vfork() 的函数返回,或在成功调用 _exit() 或 exec 系列函数之一之前调用任何其他函数。

作为第二个侧面说明,vfork已从中删除SUSv4- 使用它真的没有意义。

于 2012-02-19T09:06:05.293 回答