我在C ++中遇到execvp()
的问题。这是我的代码:
char * argv[]={};
command_counter = 0;
char line[255];
fgets(line,255,stdin);
argv[0] = strtok(line, TOKEN);//seperate the command with TOKEN
while (arg = strtok(NULL, TOKEN)) {
++command_counter;
cout << command_counter << endl;
argv[command_counter] = arg;
cout << argv[command_counter] << endl;
}
argv[++command_counter] = (char *) NULL;
execvp(argv[0],argv);
但问题是,当我像这样使用execvp()
时,多个参数不起作用。
与ls -a -l
一样,它只会执行ls -a
。
这个程序出了什么问题?
在你们的帮助下,通过更改char * argv [128]
的声明解决了问题答案 0 :(得分:2)
第一个错误的是你正在创建一个零大小的数组来存储参数:
char * argv[]={};
然后填充它。
那是一个很大的未定义行为红旗。
快速而肮脏的修复将确保您在那里有一些空间:
char * argv[1000];
但是,说实话,如果你达到了可能有一千多个论点的地步,那就有自己的问题。
底线是,你应该确保数组中有足够的空间来存储你的参数。
这样做的一种方式是使用动态内存分配,根据需要扩展参数数组,以确保始终有足够的空间:
using namespace std;
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#define TOKEN " "
static char **addArg (char **argv, size_t *pSz, size_t *pUsed, char *str) {
// Make sure enough space for another one.
if (*pUsed == *pSz) {
*pSz = *pSz + 25;
argv = (char **) realloc (argv, *pSz * sizeof (char*));
if (argv == 0) {
cerr << "Out of memory\n";
exit (1);
}
}
// Add it and return (possibly new) array.
argv[(*pUsed)++] = (str == 0) ? 0 : strdup (str);
return argv;
}
int main (void) {
Initial size, used and array.
size_t sz = 0, used = 0;
char **argv = 0;
// Temporary pointer and command.
char *str, line[] = "ls -a -l";
// Add the command itself.
argv = addArg (argv, &sz, &used, strtok (line, TOKEN));
// Add each argument in turn, then the terminator.
while ((str = strtok (0, TOKEN)) != 0)
argv = addArg (argv, &sz, &used, str);
argv = addArg (argv, &sz, &used, 0);
// Then execute it.
execvp (argv[0], argv);
// Shouldn't reach here.
return 0;
}