5

我想准备一个老式的参数向量(argv)在函数中使用

int execve(const char *filename, char *const argv[],char *const envp[]);

我尝试使用 stl::vector 类:

std::string arguments = std::string("arg1");    
std::vector<char*> argv; 
char argument[128];
strcpy(argument, arguments.c_str());
argv.push_back(argument); 
argv.push_back('\0'); // finish argv with zero

最后我将向量传递给 execve()

execve("bashscriptXY", &argv[0], NULL)

代码编译但 ArgV 被 execve()“忽略”。所以这似乎是错误的,我正在尝试。我应该如何使用 c++ 以有效的方式构建 argV?

4

4 回答 4

5

请注意,这argv[0]始终是命令本身的名称。因此,如果您想将 1 个参数传递给程序,则必须填写两个元素:

argv[0]应该是“ bashscriptXY”(或任何你想要的......)
argv[1] = "your_argument"

于 2009-11-05T20:17:13.353 回答
5

我认为 char[128] 是多余的,因为字符串 local 将具有相同的生命周期,另外,尝试像 rossoft 在他的回答中所说的那样将程序添加为 argv[0] :

const std::string arguments("arg1");    
std::vector<const char*> argv;

argv.push_back("bashscriptXY");
// The string will live as long as a locally allocated char*
argv.push_back(arguments.c_str()); 
argv.push_back(NULL); // finish argv with zero

execve(argv[0], &argv[0], NULL);
于 2009-11-05T20:34:51.080 回答
2

几个问题:

  • 数组的第一个元素argv应该是程序名称
  • argv向量可以采用不修改参数的类型(尽管被调用的进程可能 - 但这些将是其自己地址空间中的副本)char const*execve()所以你可以将c_str()字符串推到它上面。(看评论)

试试这个:

// unfortunately, execve() wants an array of `char*`, not
//  am array of `char const*`.
//  So we we need to make sure the string data is 
//  actually null terminated
inline
std::string& null_terminate( std::string& s)
{
    s.append( 1, 0);
    return s;
}

// ...

std::string program = std::string( "bashscriptXY");
std::string arg1("arg1");
std::string arg2("arg2");

null_terminate(program);
null_terminate(arg1);
null_terminate(arg2);

std::vector<char *> argv; 

argv.push_back( &program[0]);
argv.push_back( &arg1[0]); 
argv.push_back( &arg2[0]); 
argv.push_back( NULL); // finish argv with zero

intptr_t result = execve( program.c_str(), &argv[0], NULL);
于 2009-11-05T21:02:34.610 回答
1

除非参数是硬编码的,否则您必须进行一些动态内存分配。首先,为参数数量创建一个字符指针数组,然后为每个参数分配内存并复制数据。

这个问题非常相似,包括一些代码解决方案。

于 2009-11-05T20:19:03.333 回答