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
数组中的指针将不再有效。这会导致 未定义的行为 ,你很幸运程序实际上并没有崩溃(这是未定义行为的常见症状)。
我正在用 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
数组中的指针将不再有效。这会导致 未定义的行为 ,你很幸运程序实际上并没有崩溃(这是未定义行为的常见症状)。