簡體   English   中英

轉換std :: vector <char*> 到一個C風格的參數矢量arv

[英]Convert std::vector<char*> to a c-style argument vector arv

我想准備一個老派的參數向量(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?

請注意, argv[0]始終是命令本身的名稱。 因此,如果要將1個參數傳遞給程序,則必須填充兩個元素:

argv[0]應該是“ bashscriptXY ”(或者你想要的任何東西......)
argv[1] = "your_argument"

我認為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);

一些問題:

  • 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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM