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

L.p*_*ppt 6 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;
  }
Run Code Online (Sandbox Code Playgroud)

vfork()的情况下,父进程和子进程使用的地址空间是相同的,因此应该存在变量pid的单个副本.现在我无法理解这个pid变量如何具有vfork()返回的两个值,即,对于子项为零而对于父项为非零?

fork()的情况下,地址空间也被复制,每个子节点和父节点中都有两个pid变量副本,所以我可以理解在这种情况下,两个不同的副本可以有fork()返回的不同值,但是无法理解在vfork()的情况下,pid如何具有vfork()返回的两个值?

cni*_*tar 6

没有2份.当你vfork的孩子做了事情时(直到它打电话_exit(2)或者execve(2)),你给父母冻结了.所以在任何一个时刻,只有一个pid变量.

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

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

作为第二个附注,vfork已被删除SUSv4- 使用它真的没有意义.

  • @ L.ppt当父继续`pid_t`将存储子的PID时. (2认同)
  • @ L.ppt:编译器特别处理从`vfork()`返回的`pid_t`变量.它总是在寄存器上,不会溢出到内存中. (2认同)