vfork永远不会结束

zsl*_*ius 2 c linux fork vfork

以下代码永远不会结束.这是为什么?

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int nums[SIZE] = {0, 1, 2, 3, 4};
int main()
{
  int i;
  pid_t pid;
  pid = vfork();
  if(pid == 0){  /* Child process */
    for(i = 0; i < SIZE; i++){
      nums[i] *= -i;
      printf(”CHILD: %d “, nums[i]);    /* LINE X */
    }
  }
  else if (pid > 0){  /* Parent process */
    wait(NULL);
    for(i = 0; i < SIZE; i++)
      printf(”PARENT: %d “, nums[i]);   /* LINE Y */
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:

这段代码只是为了说明我遇到的一些困惑vfork().看起来当我使用时vfork(),子进程不会复制父进程的地址空间.相反,它共享地址空间.在这种情况下,我希望nums数组可以通过这两个进程更新,我的问题是以什么顺序?操作系统如何在两者之间同步?

至于为什么代码永远不会结束,可能是因为我没有明确的退出任何_exit()exec()声明.我对吗?

UPDATE2:
我刚读过:56.fork ()和vfork()系统调用之间的区别? 我认为这篇文章帮助我解决了我的第一个困惑.

来自的vfork()系统调用的子进程的父进程的地址空间执行(这可以覆盖父的数据和堆栈),它暂停父进程,直到子进程退出.

Phi*_*all 8

引用vfork(2)手册页:

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

你正在做很多这样的事情,所以你不应该期望它能够发挥作用.我认为这里真正的问题是:你为什么要使用vfork()而不是fork()

  • 除了菲利普肯德尔的回答,请阅读:[**56.fork()和vfork()系统调用之间的区别?**](http://dev.fyicenter.com/Interview-Questions/UNIX/Difference_between_the_fork_and_vfork_system.html) (2认同)