如何使execvp()处理多个参数?

时间:2015-04-07 05:25:30

标签: c++ linux shell

我在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]

的声明解决了问题

1 个答案:

答案 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;
}