fork在递归函数中的用法

时间:2014-03-02 15:48:08

标签: c++ recursion fork

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

这是我的递归函数

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是什么问题。

2 个答案:

答案 0 :(得分:1)

回答你的问题

  

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

每次调用函数pipe时,您都会调用函数sum。这将创建一个独特的,匿名的双向管道。但是,您没有检查pipe的返回值。可能没有创建管道,因为您忽略了返回值。手册页说明了

  

成功时,返回零。

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

如果您在问题中包含您的目标以及您认为代码无法完成的原因,则可以提供更明智的答案。只是看看你的代码,我假设你明白当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)的事情。三江源!