Shell程序中execvp函数调用返回无法访问错误
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(' ');
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
数组中的指针将不再有效。这会导致未定义行为,并且您非常幸运的是程序实际上没有崩溃(这是未定义行为的常见症状)。
相关文章:
- 为什么我的 setter 方法会产生错误的访问错误
- OpenCV C++ 3 维垫数据访问错误值
- C++ 将元素分配给映射值时访问错误
- 为什么代码会抛出非法内存访问错误
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 从触摸回调访问向量元素的方法时,不良访问错误
- 筛子上的访问错误
- 查找() 上的 C++ 错误访问错误
- OPENCV MAT内存访问错误
- C - 空数对象的初始化发送不良访问错误
- std::函数 创建临时内存时内存访问错误
- 不良访问C 错误
- C 中的模棱两可的访问错误
- Win 32写入文件:访问错误1784
- 奇怪的结构访问错误
- 64位Windows API结构对齐导致命名管道上出现“拒绝访问”错误
- 不是NULL指针,而是错误的访问错误消息
- 统一读取和不可修复的访问错误
- 带有 libcurl C++的内存访问错误
- 非法内存访问错误