我正在使用fork/vfork函数,这让我感到困惑。在史蒂文斯书中写道:



所以我尝试测试是否会出现printf错误,在vfork手册中有:



但是当我编译并执行此程序时:

  #include<stdio.h>
  #include<stdlib.h>
  #include<unistd.h>
  #include<sys/types.h>
  #include<sys/wait.h>

  int main()
{
  int s;
  pid_t ret;
  if (vfork() == 0)
  {
      //abort();
      exit(6);
  }
  else
  {
      ret=wait(&s);
      printf("termination status to %d\n",s);
      if (WIFEXITED(s))
          printf("normalnie, status to %d\n",WEXITSTATUS(s));
  }
  return 0;
}

一切正常,我没有收到任何printf错误。这是为什么?

最佳答案

您引用的段落末尾说:



这很可能正在发生。您的操作系统实际上并没有关闭流(但可能会刷新它)。

重要的不是exit在这里做什么,而是其基本概念。 child 正在共享父级的内存和堆栈帧。这意味着 child 可以很容易地更改 parent 不希望的事情,这很容易导致 parent 在再次开始运行时崩溃或行为异常。 vfork的手册页上说,进程唯一可以做的就是调用exit()exec。实际上, child 甚至不应该分配内存或修改任何变量。

要查看其影响,请尝试将vfork调用放在函数内部,然后让子级在那里返回或修改一些变量,然后看看会发生什么。

关于c - 标准流和vfork,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10036068/

10-15 23:59