不能使用execlp()和字符串中的命令执行二进制文件

时间:2014-12-14 13:49:06

标签: 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:无法执行二进制文件

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

1 个答案:

答案 0 :(得分:2)

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

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

您的来电有argv[0] = "-c",因此bash没有看到-c作为选项,并将command视为要运行的脚本的名称。