我有一个递归函数,我在其中制作一个管道。我假设每个函数调用都有自己的管道。是这样的吗?
这是我的递归函数
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是什么问题。
答案 0 :(得分:1)
回答你的问题
我假设每个函数调用都有自己的管道。是那个 情况?
每次调用函数pipe
时,您都会调用函数sum
。这将创建一个独特的,匿名的双向管道。但是,您没有检查pipe
的返回值。可能没有创建管道,因为您忽略了返回值。手册页说明了
成功时,返回零。
您应该检查pipe
在调用时返回零,如果不返回零则中止。对close
,write
和read
的调用也是如此。
如果您在问题中包含您的目标以及您认为代码无法完成的原因,则可以提供更明智的答案。只是看看你的代码,我假设你明白当fork
的结果为零时,你就处于子进程中。看起来您正在将一些结果写入管道,但随后您继续执行。这可能不是你的意图。如果不是,则应在子进程中调用exit
以在写入管道后终止执行。
答案 1 :(得分:0)
修复了代码! 我刚刚在子进程中包含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)所做的,所以代码给出了正确的输出。任何人都可以在这段特殊的代码中解释这个退出(0)的事情。三江源!