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

cannot execute binary file using execlp() with command in a string

本文关键字:执行 execlp 二进制文件 字符串 命令      更新时间:2023-10-16

我试图在包含字符串的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视为要运行的脚本的名称。