execl中的路径(linux)

Posted

技术标签:

【中文标题】execl中的路径(linux)【英文标题】:Path in execl(linux) 【发布时间】:2014-03-05 20:05:30 【问题描述】:

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

我认为 (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;
 

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

【问题讨论】:

【参考方案1】:

我相信,从您的陈述“我认为 (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 搜索路径中搜索可执行文件。

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

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

祝你任务顺利。

【讨论】:

【参考方案2】:

main 的返回值是 exit(3) 的值,也是 wait(3) 系列调用为子进程检索的值。您设置了管道,但不使用它们。

从头开始,仔细考虑一下父级和它的子级将如何通信(子级如何接收要做的工作,它如何返回结果;子级是留在周围等待进一步的工作还是退出)。一旦你搞定了,就去仔细阅读相关的手册页。很容易误解它们,因为它们非常简洁。提高编译器的警告级别(并选择温和的优化,许多警告依赖于编译器仅在优化时收集的数据),要么清除所有警告,要么绝对确保编译器已经脱离了它的摇杆.

当您遇到问题时,将程序缩减到尽可能小以说明问题(我们这里不都是自虐狂,渴望阅读数百行以了解某人在问什么)并再次提问。

【讨论】:

我包括了管道,因为我需要管道,它还没有,但我必须包括它,接下来我会尽量减少这个问题。谢谢你的帮助 @user2831683,再次阅读我的答案。我不知道(或很在意)您要做什么;对您问题核心的干扰越少,我们(或您,就此而言)越容易发现问题出在哪里。【参考方案3】:

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

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

【讨论】:

管道已实现但未使用,但我需要它们来工作,所以我会正确实现它们,但在这个问题中,我只是对 execl 感到困惑,即如何传递文件路径在里面。

以上是关于execl中的路径(linux)的主要内容,如果未能解决你的问题,请参考以下文章

Python 实现把一个文件夹下所有的文件名和绝对路径(包括子文件夹)存入execl表格

Python 实现把一个文件夹下所有的文件名和绝对路径(包括子文件夹)存入execl表格

execl vs execv,参数大小未知

execl 导出

导入execl,获取execl内的数据转换为table

C# Execl表格文件转xml文件