[英]How to make execvp() handle multiple arguments?
我在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]的语句解决了该问题。
第一件事是要创建一个零大小的数组来存储参数:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.