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

标签 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] 的语句解决了问题

最佳答案

第一个错误是您正在创建一个零大小的数组来存储参数:

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

关于c++ - 如何使 execvp() 处理多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29484366/

相关文章:

linux - 用linux文件中的字符串替换字符串模式

c++ - 未收到 ZMQ 消息

c++ - 混合 C++/Cli 项目的单元测试

c++ - WT 保存文件对话框窗口?

c++ - 使用 Bind 创建处理程序函数以处理单击的菜单项 - wxWidgets 3.0

c++ - Linux乐观malloc : will new always throw when out of memory?

linux - 为什么debian安装器是exe文件

python - 生产中是否需要 Python 虚拟环境?

bash - 比较同一目录中的文件

linux - 如何从 bash shell 获取输出