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

时间:2015-09-24 12:45:08

标签: c++ shell posix execvp

我正在用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('\0');
    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编译代码。有没有人有什么想法?

1 个答案:

答案 0 :(得分:0)

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