vfork()系统调用中的返回值

时间:2012-02-19 08:59:23

标签: c operating-system system-calls systems-programming

考虑以下代码:

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

1 个答案:

答案 0 :(得分:6)

没有2份。当你对孩子做出事情时(vfork_exit(2)),父母会execve(2)来冻结父母。所以在任何一个时刻,只有一个pid变量。

作为旁注,你所做的是不安全的。 The standard明确说明:

  

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

作为第二个附注,vfork已从SUSv4中移除 - 使用它确实没有意义。