我有一个递归函数,在其中创建管道。我假设每个函数调用都有自己的管道。是这样吗?
这是我的递归函数。
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
什么是错误的初始化。
回答您的问题
我假设每个函数调用都有它自己的管道。那是情况?
您每次调用函数pipe
都会调用一次函数sum
。这将创建一对唯一的,匿名的双向管道。但是,您没有检查pipe
的返回值。因为您忽略了返回值,所以可能未创建管道。手册页指出
成功时返回零。
您应检查pipe
在调用时是否返回零,如果未返回零,则中止。对close
,write
和read
的调用也是如此。
如果您在问题中加入目标,以及为什么认为您的代码无法实现目标,则可以提供更明智的答案。仅查看您的代码,我假设您了解,当fork
的结果为零时,您就在子进程中。看起来您正在向管道中写入一些结果,但是随后您继续执行。这可能不是您的意图。如果不是,则应在子进程中调用exit
,以在写入管道后终止执行。
得到固定的代码!我只是在子进程中包含了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)事情。谢谢!