繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM