在C中创建一个进程树

时间:2010-03-01 03:12:58

标签: process tree fork

如何创建一个看起来像深度为N的平衡三元树的流程层次结构? ...意味着每个进程有3个子进程,因此在深度为N的树中会有(3 ^ N-1)/ 2个进程。要创建新进程,我只想使用fork()。

这是我到目前为止所做的,但我认为它不起作用,因为我不处理进程ID,而且我真的不认为我应该递归地执行此操作:

void createTernaryTree(int n) {
   if((n-1) == 0) return;
   else {
      int x;
      for(x=0; x<3; x++) {
         fork();
         createTernaryTree(n-1);
      }
   }
}

谢谢, Hristo

2 个答案:

答案 0 :(得分:2)

这一点看起来不对我:

for(x=0; x<3; x++) {
   fork();
   createTernaryTree(n-1);
}

问题是父级和子级都继续循环并进行递归。

根据fork的返回值(子节点为0,父节点为> 0,出错时为-1),您应该决定是循环还是递归。

答案 1 :(得分:0)

显示的代码可以完成工作显示的代码几乎可以完成工作(但是有一个微妙的问题)。另一个困难是表明它能够胜任。

问题是代码在fork之后对子进程和父进程的行为不同。父进程需要完成其循环。每个孩子都需要在下一级重新启动一个循环:

  for (int x = 0; x < 3; x++) // C99
  {
     if (fork() == 0)
     {
         createTernaryTree(n-1);
         break;  // Per comment from R Samuel Klatchko
     }
  }
  pause();  // See below

您可以(应该)添加'pause();'循环后调用;这会将父进程发送到暂停动画,直到收到信号。然后,您可以显示您有一个进程树。或者,使用'sleep(30)'或其他暂停进程的方式。你不希望他们立即退出;为了能够展示树状结构,他们会很快做到这一点。

理论上,你可能想跟踪'fork()'是否成功;在实践中,目前尚不清楚你会做什么不同的事情,除非或许,如果第一个孩子失败就不要试图创造第二个孩子(但这可能会失败,所以盲目尝试可能是最好的情况 - 但请记住在其他情况下,它通常很重要。)

树本质上是递归结构;使用递归来管理它们通常是处理它们的最佳方式。这看起来像尾递归,这意味着它可以很容易地转换为循环结构。但是,管理数据结构以密切关注正在发生的事情将比以递归方式执行更难。