我要准备一个老学校参数矢量(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);

除非参数是硬编码的,你就必须做一些动态内存分配。首先,创建字符指针的数组的自变量的数量,则对于每一个参数分配内存和复制数据。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top