c++ - 无法使用 execlp() 和字符串中的命令执行二进制文件

标签 c++

我试图在包含一个字符串的 C++ 程序中执行一个命令,并将其输出到另一个字符串,但我认为我在 execl() 中做错了什么,这里是我的代码:

void execAndSend(std::string command){
    int fds[2];
    char buffer[1000];
    int res = pipe(fds);
    if (res < 0) {
        std::cerr << "pipe() error" << std::endl;
        exit(3);
    }

    pid_t pid = fork();
    if (pid == 0) {             
    close(fds[0]);
    dup2(fds[1], 1); 
        execl("/bin/bash", "-c", command.c_str(), NULL);        

    }
    else if (pid > 0) {    
        close(fds[1]);
        read(fds[0], buffer, sizeof(buffer));       
        std::cout << "Command: '"<< buffer << std::endl;
        wait(NULL);        
    }
    else {
        std::cerr << "error in fork()" << std::endl;
        exit(4);
    }
    exit(0);
}

当我运行它时,我得到如下信息: /bin/ls:/bin/ls: 无法执行二进制文件

我希望能够使用所有命令选项、管道、重定向等。我该怎么做?

最佳答案

您缺少 execl 的参数。第一个参数是要运行的程序,其余参数是要进入 argv 的参数,但是您遗漏了 argv[0] 的值,其中包含名称的程序。所以应该是:

execl("/bin/bash", "bash", "-c", command.c_str(), NULL);

你的电话有 argv[0] = "-c",所以 bash 没有看到 -c 作为一个选项,并且将 command 视为要运行的脚本的名称。

关于c++ - 无法使用 execlp() 和字符串中的命令执行二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469977/

相关文章:

c++ - WinAPI:如何确定网络何时正在识别?

c++ - OpenGL函数需要调用两次才能生效

c++ - 谷歌模拟 :Testing a Certain Property of an Object

c++ - 避免可变参数模板函数中的结构

c++ - Unordered_map 或 hashMap 现有散列函数修改?

c++ - 对 PCLPointCloud2 进行下采样,使其井井有条

c++ - 为什么重载的移动赋值运算符返回左值引用而不是右值引用?

c++ - 除了 find_if() 或迭代器之外,还可以通过键访问对 vector 中的元素

c++ - as_bytes 函数的精确定义

c++ - 为什么 'unbounded_array' 比 'vector' 更有效?