【问题标题】:Forking a binary tree, fork functionality issue分叉二叉树,分叉功能问题
【发布时间】:2013-06-27 20:57:36
【问题描述】:

好的,所以我一直在stackoverflow上寻找这个,并且肯定用谷歌搜索了半个小时,但我得到的答案似乎与我真正想做的事情几乎没有任何关系,希望有人能提供帮助我在这个,这是代码:

int cCount = 0;

while(cCount < 2)
{
    switch(fork())
    {
    case 0:
    cCount++;
    break;

    case -1:
    printf("Failed");
    break;

    default:
    break;
    }
}

return;

现在对于出现的问题,此代码假设创建一个具有 3 个级别 (0,1,2) 的树,

0 是它开始分叉的主要父级

1 是 0 中父母的 2 个孩子

2 是 1 中 2 个父母的 4 个孩子

创建对称树。基本上虽然我有几个问题:

  1. Switch 在每个循环上都执行 fork,所以理论上如果 fork > 0,它仍然会被 fork,为父级创建一个子子级,并且循环将继续进行,因此它可能会以链父级结束- parent-parent-parent,而不是每个父母 2 个孩子,然后 2 个孩子 4 个等等。fork 怎么知道该怎么做?

  2. 例如,假设我想做一棵树,并在最后一层(级别)附加一个孩子,我该如何开始?

我对 fork 的理解正确吗?如果不是,请解释一下,网上有很多教程,但它们似乎都使它变得比它可能的复杂得多。

干杯,谢谢 对我好点,英语不是我的母语。

【问题讨论】:

    标签: c linux tree fork std


    【解决方案1】:

    这段代码基本上会分叉炸弹,原因如下:

    当进程遇到第一个fork 时,它将为子进程返回 0,为父进程返回一个正数(子进程的 PID)。因此,cCount 的父级实例永远不会增加,因此循环将永远运行。

    【讨论】:

    • 很高兴知道我设计了一个 DoS,总是很方便。在那种情况下,您如何在分叉的孩子中调用分叉。因为如果你只调用 fork() 它只会 fork 父级。
    • 你需要做的是交换一些东西,所以cCount++; 行在default: 块中,而不是case 0: 块中。此外,您应该将行 cCount = 0; 添加到 case 0: 块。为了防止它永远循环,您需要一个从零开始并在我刚刚提到的cCount = 0; 行之后立即递增的level 变量。然后,您可以使用该变量来确定是否应该继续分叉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多