Shell程序中execvp函数调用返回无法访问错误

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

本文关键字:访问 错误 返回 函数调用 程序 execvp Shell      更新时间:2023-10-16

我正在用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('');
    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;

然后在下面的代码中将参数传递给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编译代码。有人知道是怎么回事吗?

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