#include <iostream>
#include <string>
#include <vector>
extern "C" int execv(const char *pathname, char *const argv[]);
// we want to start program using execv() call
// with a list of generated arguments, but something went wrong:
// execv() receives some of arguments that are not the same that we've prepared
void problem1(const std::string &exe, int nargs) {
std::vector<std::string> args;
std::vector<char *> argv;
for (auto i = 0; i < nargs; ++i) {
args.push_back("Value_" + std::to_string(i + 1));
argv.push_back((char *)(args[i].c_str()));
std::cout << i << ": " << args[i] << " " << argv[i] << std::endl;
}
argv.push_back(nullptr); // store end of list marker
execv(exe.c_str(), argv.data());
}
/////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
problem1(argv[0], 5);
return 0;
}
extern "C" {
// stub for system's execv function
int execv(const char *pathname, char *const argv[]) {
std::cout << "pathname = {" << pathname << "}" << std::endl;
for (auto i = 0; argv[i] != nullptr; ++i) {
std::cout << "argv[" << i << "] = {" << argv[i] << "}" << std::endl;
}
return 0;
}
}