叉示例帮助

时间:2015-09-22 10:26:36

标签: c fork

我正在学习fork,我希望有人能为所提供的代码提供父子关系图。我已经在C中运行了它,并得到了输出。根据我的理解,只需要一些确认。

#include <stdio.h>

main()
{
  int i, pid, notdone = 1;
  for (i = 0 ; i < 2 && notdone ; i++)
  {
    printf("Tic!\n");
    if ((pid=fork())==0)
    {
      printf("Tac!\n");
      notdone=0;
    }
    else
    {
      printf("Toe!\n");
    }
  }
}

输出:Tic Toe Tic Tac Toe Tac

我相信fork会被调用两次,因此有4个进程在运行。 1)“Tic”然后fork,Parent先行,“Toe”,再次运行循环,“Tic”然后再次fork,但首先等待Child1;然后“Tac”回到Parent,因为条件测试失败,Parent再次,“Toe”,再次运行循环但是条件失败因此退出; Child2去,“Tac”,因条件测试失败而退出。我做对了吗?

1 个答案:

答案 0 :(得分:0)

有3个进程:父进程和两个子进程。

父母执行以下序列:“Tic”,fork,“Toe”,“Tic”,fork,“Toe”,退出。

每个孩子都按照以下顺序执行:“Tac”,退出。

输出如何发生交错是未定义的,这意味着没有规则说明必须如何发生,所以你的“等待”和“回去”是不正确的。在实践中,您可能会发现卸载的计算机上的输出顺序变化不大,因为它们的时间是正确的,但您应该从不依赖它。