在递归函数中使用fork
Usage of fork in a recursive function
我有一个递归函数,在其中我制作了一个管道。我假设每个函数调用都有自己的管道。是这样吗?
这是我的递归函数。
int sum(tree *&root , tree *&root2, int value1 , int value2 , int result_tree)
{
if(root->l_child == NULL && root->r_child == NULL)
return root->data;
else
{
value1 = sum(root->l_child , root2 , value1 , value2 , result_tree);
value2 = sum(root->r_child , root2 , value1 , value2 , result_tree);
int fd2[2];
pipe(fd2);
if(fork() == 0)
{
if(root->data == 43)
result_tree = value1 + value2;
else if(root->data == 45)
result_tree = value1 - value2;
else if(root->data == 42)
result_tree = value1 * value2;
else if(root->data == 47)
result_tree = value1 / value2;
close(fd2[0]);
write(fd2[1] , &result_tree , sizeof(result_tree));
}
else
{
close(fd2[1]);
read(fd2[0] , &result_tree , sizeof(result_tree));
}
root->data = result_tree;
delete_node(root2 , root);
//cout<<"n";
//display_in(root2);
return result_tree;
}
}
它给出的输出次数与表达式中操作数的次数一样多。例如,如果用户输入表达式:3+4+4,则输出为:result:11result11result11
init出了什么问题。
回答您的问题
我假设每个函数调用都有自己的管道。那是案例
每次调用函数sum
时,都会调用一次函数pipe
。这将创建一对独特的、匿名的双向管道。但是,您没有检查pipe
的返回值。可能是因为忽略了返回值,所以没有创建管道。手册页说明
成功时,返回零。
您应该检查pipe
在调用时是否返回零,如果未返回零则中止。对close
、write
和read
的调用也是如此。
如果你在你的问题中包括你的目标以及为什么你认为你的代码没有实现它,那么就有可能提供一个更明智的答案。只要看一下您的代码,我假设您理解当fork
的结果为零时,您就处于子进程中。看起来您正在将一些结果写入管道,但随后您继续执行。这可能不是你的意图。如果不是,则应该在子进程中调用exit
,以便在写入管道后终止执行。
修复了代码!我刚刚在子进程中包含了出口(0),它运行良好。
int sum(tree *&root , tree *&root2, int value1 , int value2 , int result_tree)
{
if(root->l_child == NULL && root->r_child == NULL)
return root->data;
else
{
value1 = sum(root->l_child , root2 , value1 , value2 , result_tree);
value2 = sum(root->r_child , root2 , value1 , value2 , result_tree);
int fd2[2];
pipe(fd2);
if(fork() == 0)
{
if(root->data == 43)
result_tree = value1 + value2;
else if(root->data == 45)
result_tree = value1 - value2;
else if(root->data == 42)
result_tree = value1 * value2;
else if(root->data == 47)
result_tree = value1 / value2;
close(fd2[0]);
write(fd2[1] , &result_tree , sizeof(result_tree));
exit(0); // change
}
else
{
close(fd2[1]);
read(fd2[0] , &result_tree , sizeof(result_tree));
}
root->data = result_tree;
delete_node(root2 , root);
//cout<<"n";
//display_in(root2);
return result_tree;
}
}
我不明白exit(0)到底做了什么,所以代码给出了正确的输出。有人能在这段特定的代码中解释这个exit(0)的事情吗。谢谢!
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 在递归函数中使用fork