叉在递归函数中的用法

问题描述 投票:0回答:2

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

这是我的递归函数。

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

什么是错误的初始化。

c++ recursion fork
2个回答
1
投票

回答您的问题

我假设每个函数调用都有它自己的管道。那是情况?

您每次调用函数pipe都会调用一次函数sum。这将创建一对唯一的,匿名的双向管道。但是,您没有检查pipe的返回值。因为您忽略了返回值,所以可能未创建管道。手册页指出

成功时返回零。

您应检查pipe在调用时是否返回零,如果未返回零,则中止。对closewriteread的调用也是如此。

如果您在问题中加入目标,以及为什么认为您的代码无法实现目标,则可以提供更明智的答案。仅查看您的代码,我假设您了解,当fork的结果为零时,您就在子进程中。看起来您正在向管道中写入一些结果,但是随后您继续执行。这可能不是您的意图。如果不是,则应在子进程中调用exit,以在写入管道后终止执行。


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)所做的事情,因此代码给出了正确的输出。任何人都可以在这段特定的代码中解释这个exit(0)事情。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.