【问题标题】:create a process tree in C在 C 中创建进程树
【发布时间】:2010-03-01 03:12:58
【问题描述】:

我将如何创建一个看起来像深度为 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);
      }
   }
}

谢谢, 赫里斯托

【问题讨论】:

  • 请贴出你目前写的代码。人们通常不喜欢只为您编写代码。
  • 如果这是作业,请标记它。
  • 我假设您可以将平衡树编码为数据结构。为什么分叉过程有趣地不同?
  • 我不知道如何处理作为树节点的进程并且进行递归对我来说没有意义,但如果它只是一个非树节点我会这样做处理东西。

标签: process tree fork


【解决方案1】:

我觉得这有点不对:

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

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

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

【讨论】:

  • 我必须同意。虽然这并不明显,但我在没有看到您的答案的情况下得出了这个结论 - 并且在没有看到您的答案的情况下更改了我的答案。
【解决方案2】:

显示的代码可以完成这项工作 显示的代码几乎可以完成这项工作(但有一个微妙的问题)。另一个困难是证明它可以完成这项工作。

问题在于代码在 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()”是否成功;在实践中,不清楚你会做些什么不同的事情,除非如果第一个孩子失败了,也许不要尝试创建第二个孩子(但无论如何这很可能会失败,所以在这种情况下盲目尝试可能是最好的 - 但请记住在其他情况下,这通常很重要)。

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

【讨论】:

  • 乔纳森 - 您的代码仍然看起来有点不对劲。正如它所写,一旦 createTernaryTree 返回,它将继续循环。
  • 我休息一下;在 createTernaryTree(n-1) 之后;我认为这应该可行。
  • @Hristo - 我也是这么做的。我认为它现在可能真的有效。在树变得非常深之前,您可能会遇到允许拥有的进程数量的限制。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多