我正在用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编译代码。有没有人有什么想法?
答案 0 :(得分:0)
详细说明我对你的问题的猜测:我猜这个标记化(第一个代码片段)是在一个单独的函数中,然后它返回,这使得你的字符向量向量被破坏,所以指针保存在args
数组中将不再有效。这会导致未定义的行为,并且您很幸运,程序实际上并未崩溃(这是未定义行为的常见症状)。