转换std::矢量<char*> c风格的参数,矢量的抗逆转录病毒药物
题
我要准备一个老学校参数矢量(argv)使用内部的功能
int execve(const char*filename,char *const argv[],char*const入[]);
我试过stl::矢量级:
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().因此它似乎是错误的,我尝试。我应该如何建立一个argV在一个高效率的方式使用c++?
解决方案
我认为的char [128]是多余的,因为在字符串局部将具有相同的寿命,另外,尝试添加程序将以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);
其他提示
要注意的是argv[0]
总是命令本身的名称。所以,如果你想1个参数传递给一个程序,你需要填写两个元素:
argv[0]
应该是“bashscriptXY
”(或任何你想要的......)点击
argv[1] = "your_argument"
几个问题:
- 的第一个元素
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);
除非参数是硬编码的,你就必须做一些动态内存分配。首先,创建字符指针的数组的自变量的数量,则对于每一个参数分配内存和复制数据。
这个问题是非常相似的,并且包括一些代码的解决方案。
不隶属于 StackOverflow