execl中的路径(linux)

时间:2014-03-05 20:05:30

标签: c++ linux exec posix

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

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

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;
 }

min(subtratction)/ mul / div cpp类似于add 谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

我相信,从你的陈述“我认为(add / min / mul / div)程序在execl中没有被正确调用”,你就会问为什么你的execl调用失败了。

您可能需要指定add / min / mul / div二进制文件的完整路径,例如:

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

如果你检查man page for execl,你会发现它需要一个路径,而execlp将采用一个文件名并在环境变量PATH搜索路径中搜索一个exectable。

另请注意,execl的参数必须以NULL结尾。

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

祝你好运。

答案 1 :(得分:1)

main的返回值是exit(3)所采用的内容,以及wait(3)系列调用为子进程检索的内容。您设置管道,不要使用它们。

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

当你绊倒一个问题时,将程序缩小到尽可能小以说明要点(我们这里不是所有的受虐狂,渴望阅读数百行以了解有人在问什么)并再次提问。

答案 2 :(得分:0)

我不确定你的问题是什么,但你需要null终止你的论点,比如

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