2014-03-05 40 views
0

我需要在execl中传递两个整数值,我将它们转换为(const char *),然后传递它们。在execl中,我想将参数传递给其他cpp文件,然后这些程序将计算,然后它们将返回结果。在execl中的路径(linux)

我认为(add/min/mul/div)程序在execl中没有正确调用。

static int sum_calculation(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_calculation(root->l_child , root2 , value1 , value2 , result_tree); 
     value2 = sum_calculation(root->r_child , root2 , value1 , value2 , result_tree); 

     stringstream str1 , str2; 
     str1 << value1; 
     str2 << value2; 
     string temp_str1 = str1.str(); 
     string temp_str2 = str2.str(); 
     const char* ch1 = (char*) temp_str1.c_str(); 
     const char* ch2 = (char*) temp_str2.c_str(); 

     int fd2[2]; 
     pipe(fd2); 
     if(fork() == 0) 
     { 
      const char *adder = "add"; 
      const char *multiplier = "mul"; 
      const char *subtractor = "min"; 
      const char *divider = "div"; 

      if(root->data == 43) 
       execl(adder , ch1 , ch2);  
      else if(root->data == 45) 
       execl(subtractor , ch1 , ch2);  
      else if(root->data == 42) 
       execl(multiplier , ch1 , ch2);  
      else if(root->data == 47) 
       execl(divider , ch1 , ch2); 

      close(fd2[0]); 
      write(fd2[1] , &result_tree , sizeof(result_tree)); 
      exit(0); 
     } 
     else 
     { 
      close(fd2[1]); 
      read(fd2[0] , &result_tree , sizeof(result_tree)); 
      //wait(); 
     } 

     root->data = result_tree; 
     delete_node(root2 , root); 
     return result_tree; 
    } 
} 

添加的功能是:

#include <sstream> 
#include <string.h> 
#include<iostream> 
using namespace std; 

int main(int argc , char *argv[]) 
{ 
     int Result , value1 , value2; 
     stringstream convert1(argv[1]); 
     stringstream convert2(argv[2]); 

     if (!(convert1 >> value1)) 
      Result = 0; 

     if (!(convert2 >> value2)) 
      Result = 0; 

     Result = value1 + value2; 
     return Result; 
} 

分钟(subtratction)/ MUL/DIV CPP的类似于添加 三江源的帮助。

回答

2

我相信,从你的陈述:“我认为(添加/分/ MUL/DIV)程序在execl中没有正确调用“,你在问为什么你的execl调用失败。

您可能需要指定完整路径添加/分钟/ MUL/DIV的二进制文件,如:

const char *adder = "/full/path/to/add"; 
execl(adder , ch1 , ch2, NULL); 

如果检查man page for execl你会看到,它需要一个路径,而execlp将采取一个文件名,并将在环境变量PATH搜索路径中搜索可执行文件。

还要注意execl的参数必须以NULL结尾。

还要注意,如果您的exec()成功,您需要在execl之前执行管道文件描述符杂事,因为您将不会继续。

祝你好运,你的任务。

1

main的返回值是exit(3)需要的值,以及wait(3)系列调用是否为子进程检索。你建立管道,不要使用它们。

抓住这一点,仔细考虑父母及其子女将如何沟通(孩子如何接受工作要做什么,它如何返回结果;孩子是否留在等待进一步工作或退出)。一旦你清理完了,请仔细阅读相关手册页。误解它们很容易,因为它们非常简洁。提高编译器的警告级别(并选择轻度优化,许多警告依赖于编译器仅在优化时收集的数据),并且清除所有警告或绝对是确保编译器关闭其摇杆。

当你绊倒一个问题时,尽可能减少程序以说明这个问题(我们这里不是所有的受虐狂,都渴望阅读数百行文字来理解某人的要求)并再次提问。

+0

我包括管道,因为我需要管道,但它还没有,但我必须包括它,然后我会尽量修剪问题。 Thankyou的帮助 – user2831683

+0

@ user2831683,再次阅读我的答案。我不知道(或者很在乎)你想做什么;从问题的核心中分心越少,对于我们(或您,就此而言)越容易查看它出错的地方。 – vonbrand

0

我不完全相信你的问题是什么,但你需要空终止你的论点有点像

execl("./divider" , ch1 , ch2, NULL); 
+0

这些管道是实现但没有使用,但我需要他们做的工作,所以我会正确实施他们,但在这个问题上,我只是对execl感到困惑,即如何传递文件路径。 – user2831683