我正在用C++编写一个简单的shell程序。当我将参数传递给execvp时,特别是对于ls
命令,我收到ls: cannot access H��p����: Protocol error
。其他命令也会出现类似的错误。C++函数调用execvp返回无法访问C++ Shell程序中的错误
我的策略是解析输入到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);
}
我编译具有铛++和上一个Debian 8的代码虚拟机在Mac OS X.有没有人知道最新进展?
你知道,普通的输入运算符'>>'在空间上分开,并且在读取字符串时会丢弃前导空间吗?这意味着您的标记循环可以简单地为'while(ss >> s){...}'。 –
另外,你写出'args'数组的边界(并注意[可变长度数组](https://en.wikipedia.org/wiki/Variable-length_array)不是C++的一部分)。我没有首先看到嵌套向量的原因,只是使用'std :: string'的向量,然后使用'const char *'的向量,并且不要让' std :: string'出界(这可能是你的问题)!只有在实际需要时,即在“exec”调用之前,才转换为“const char *”的向量。 –
嗨,感谢您的快速响应!我使用嵌套向量是因为我不知道我的参数长度或每个单独的参数的长度,并且不想处理处理可变长度数组的开销。考虑到这一点,它仍然是次优解决方案吗? –