2014-03-05 75 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