문제

기능 내에서 사용할 구식 인수 벡터 (ARGV)를 준비하고 싶습니다.

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

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 ()에 의해 "무시"됩니다. 그래서 내가 틀린 것 같습니다. C ++로 효율적인 방식으로 ARGV를 어떻게 구축해야합니까?

도움이 되었습니까?

해결책

문자열 로컬이 같은 수명을 가질 때 Char [128]은 중복되었다고 생각합니다. 또한 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);

다른 팁

조심하십시오 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