Process 在C中创建进程树

Process 在C中创建进程树,process,tree,fork,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

我如何创建一个看起来像深度为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);
      }
   }
}
void createTernaryTree(int n){
如果((n-1)==0)返回;
否则{
int x;
对于(x=0;x显示的代码可以完成任务显示的代码几乎可以完成任务(但有一个微妙的问题)。另一个困难是显示它可以完成任务

问题在于,在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
(int x=0;x<3;x++)的
for//C99
{
如果(fork()==0)
{
createternalytree(n-1);
break;//根据R Samuel Klatchko的评论
}
}
pause();//见下文
您可以(应该)在循环之后添加一个“pause();”调用;这会将父进程发送到挂起的动画中,直到它接收到信号。然后您可以显示您有一个进程树。或者,使用“sleep(30)”'或其他挂起进程的方式。您不希望进程立即退出;它们会很快退出,您无法演示树结构

从理论上讲,您可能希望跟踪“fork()”是否成功;在实践中,您不清楚会有什么不同,除非,如果第一个孩子失败,您可能不会尝试创建第二个孩子(但这很可能会失败,所以在这种情况下,盲目尝试可能是最好的——但请记住,在其他情况下,这通常会非常重要)


树本质上是递归结构;使用递归来管理它们通常是处理它们的最简洁的方法。这看起来像是尾部递归,这意味着它可以相当容易地转换为循环结构。但是,管理数据结构以跟踪正在发生的事将比重新管理数据结构更困难粗略地说。

我觉得这一点不对:

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

for(x=0;在父级中为x 0,错误时为-1),您应该决定是循环还是递归。

请发布您迄今为止编写的代码。人们通常不喜欢只为您编写代码。如果这是家庭作业,请将其标记为家庭作业。我假设您可以将平衡树编码为数据结构。为什么分叉进程会有有趣的不同?我不知道如何处理进程作为一个树节点并执行递归对我来说没有意义,但如果它只是一个非进程内容的树,我会这样做。我必须同意。虽然这并不明显,但我没有看到你的答案就得出了这个结论-并且在我的答案中做了更改,没有看到你的答案。乔纳森-你的代码仍然有点不对劲。正如我所说的这样写的,一旦createTernaryTree返回,它将继续循环。我在createTernaryTree(n-1)之后设置了一个中断;我认为这应该会起作用。@Hristo-我刚才也这么做了。我认为它现在可能真的起作用了。在树变得很深之前,您可能会遇到允许的进程数量限制。