C++ - 对 execvp Returns 的函数调用无法访问 C++ Shell 程序中的错误

C++ - Function Call To execvp Returns Cannot Access Error In C++ Shell Program

我正在用 C++ 编写一个简单的 shell 程序。当我将我的参数传递给 execvp 时,特别是对于 ls 命令,我收到一个 ls: cannot access H��p����: Protocol error。其他命令也会出现类似的错误。

我的策略是将输入解析为 vector<vector<char>,然后将其转换为 char **

下面是转换代码:

//input is parsed from command-line above
vector< vector<char> > args_vector;

string s;
stringstream ss(input);

while(getline(ss, s, ' ')){
    vector<char> cv(s.begin(), s.end());
    cv.push_back('[=12=]');
    args_vector.push_back(cv);
}

char *args[args_vector.size() + 1];

for(int i = 0; i < args_vector.size(); i++){
    char *arg = &args_vector[i][0];   
    args[i] = arg;
}

args[args_vector.size() + 1] = NULL;

然后我在下面的代码中将 args 传递给 execvp:

pid_t child_pid
int status;
child_pid = fork();

if (child_pid == 0) {
    execvp(args[0], args);
    cout << "Error: execution of command failed";
}
else {
    pid_t pid;
    do {
        pid = wait(&status);
    } while (pid != child_pid);
}

我正在使用 clang++ 和 Mac OS X 上的 Debian 8 VM 编译代码。有人知道发生了什么吗?

详细说明我对你的问题的猜测:我猜标记化(第一段代码)是在一个单独的函数中,然后它 returns 使你拥有的字符向量的向量被破坏,因此您保存在 args 数组中的指针将不再有效。这会导致 未定义的行为 ,你很幸运程序实际上并没有崩溃(这是未定义行为的常见症状)。