我想在函数
中准备一个老派的参数向量(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”,&amp; argv [0],NULL)
代码编译但是argV被execve()“忽略”了。所以这似乎是错的,我正在尝试。我应该如何使用c ++以有效的方式构建argV?
答案 0 :(得分:5)
请注意argv[0]
始终是命令本身的名称。因此,如果要将1个参数传递给程序,则必须填充两个元素:
argv[0]
应为“bashscriptXY
”(或任何你想要的......)
argv[1] = "your_argument"
答案 1 :(得分:5)
我认为char [128]是多余的,因为字符串local将具有相同的生命周期,同样,尝试将程序添加为argv [0],就像rossoft在他的回答中所说:
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);
答案 2 :(得分:2)
一些问题:
argv
数组的第一个元素应该是程序名称argv
向量可以采用char const*
类型,因为execve()
不会修改args(虽然被调用的进程可能会 - 但是这些将是自己的副本地址空间)。所以你可以将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);
答案 3 :(得分:1)
除非参数是硬编码的,否则你必须做一些动态内存分配。首先,为参数个数创建一个字符指针数组,然后为每个参数分配内存并复制数据。
This question非常相似,包含一些代码解决方案。