2015-09-24 40 views
-1

我正在用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.有没有人知道最新进展?

+0

你知道,普通的输入运算符'>>'在空间上分开,并且在读取字符串时会丢弃前导空间吗?这意味着您的标记循环可以简单地为'while(ss >> s){...}'。 –

+0

另外,你写出'args'数组的边界(并注意[可变长度数组](https://en.wikipedia.org/wiki/Variable-length_array)不是C++的一部分)。我没有首先看到嵌套向量的原因,只是使用'std :: string'的向量,然后使用'const char *'的向量,并且不要让' std :: string'出界(这可能是你的问题)!只有在实际需要时,即在“exec”调用之前,才转换为“const char *”的向量。 –

+0

嗨,感谢您的快速响应!我使用嵌套向量是因为我不知道我的参数长度或每个单独的参数的长度,并且不想处理处理可变长度数组的开销。考虑到这一点,它仍然是次优解决方案吗? –

回答

0

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

+0

我在while循环之后打印出args中的元素,它们就是我期望的那些元素。对于ls,我运行下面的代码片段'cout << args [0] [0] << args [0] [1] << endl'并在终端打印ls'。任何其他想法可能是什么问题? –

+0

问题转而成为您指出的问题。我在'while'循环之外启动了'char * args []',现在它正常工作。十分感谢你的帮助! –