叉子在C - 运动

Mil*_*lan 15 c fork

我尝试在C丛林中用叉子砍伐树木时重复并学习更多高级用途和选项.但是我发现一个非常简单的例子,因为我之前曾使用过叉子甚至编写了一些代码,但我可以'完全理解它.

来了:

main() {
 if (fork() == 0) {
  if (fork() == 0) {
   printf("3");
  }
  else if ((wait(NULL)) > 0) {
   printf("2");
  }
 }
 else {
  if (fork() == 0) {
   printf("1");
   exit(0);
  }
  if (fork() == 0) {
   printf("4");
  }
 }
 printf("0");
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

可能的解决方案是

  1. 3201040
  2. 3104200
  3. 1040302
  4. 4321000
  5. 4030201
  6. 1403020

其中2,5和6是正确的答案.

首先,输出中不应该有四个零吗?第二......一个人如何解决问题?在纸上做了差不多一个小时,我甚至都没有理解为什么给定的解决方案比假的更正确(除了nr3,因为它不能以2结束,因为必须遵循0).

谁检查了他的叉子谁可以提供一些很好的解释?

编辑:

在这里发现这一点从2009年开始看pdf.人们现在可以停止发布关于这个作业的帖子,并且实际上试图提供帮助吗?如果没有,请找一些其他主题来花时间.谢谢 !

Mat*_*ery 10

我认为应该有4个零,这就是我看到的,如果我运行你的代码......

分析这个的一个好方法是画一个像这样的图 - 我已经显示了叉子,就像*父母水平延续,下面的孩子一样,所以每个单独的过程都在一个单独的行上:

----*----*----*----0----exit (return from main)
    |    |    |
    |    |    +----4----0----exit (return from main)
    |    |
    |    +----1----exit (explicitly)
    |
    +-----*----wait----2----0----exit (return from main)
          |
          +----3----0----exit (return from main)
Run Code Online (Sandbox Code Playgroud)

现在很容易看出,因为这个wait(),你必须看到3一段时间之后0,然后看到2之后0.

  • ......打印出8位数字,而不是答案中的7位数字 (2认同)