在递归函数中使用fork

Usage of fork in a recursive function

本文关键字:fork 递归函数      更新时间:2023-10-16

我有一个递归函数,在其中我制作了一个管道。我假设每个函数调用都有自己的管道。是这样吗?

这是我的递归函数。

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在调用时是否返回零,如果未返回零则中止。对closewriteread的调用也是如此。

如果你在你的问题中包括你的目标以及为什么你认为你的代码没有实现它,那么就有可能提供一个更明智的答案。只要看一下您的代码,我假设您理解当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)的事情吗。谢谢!