如何创建一个看起来像深度为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
答案 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()'是否成功;在实践中,目前尚不清楚你会做什么不同的事情,除非或许,如果第一个孩子失败就不要试图创造第二个孩子(但这可能会失败,所以盲目尝试可能是最好的情况 - 但请记住在其他情况下,它通常很重要。)
树本质上是递归结构;使用递归来管理它们通常是处理它们的最佳方式。这看起来像尾递归,这意味着它可以很容易地转换为循环结构。但是,管理数据结构以密切关注正在发生的事情将比以递归方式执行更难。