1、Linux/OSX 上面重新运行程序,直接使用 execvp 函数就可以了,把main 函数传递来的 argv 二维数组(命令行参数)传进去就可以,注意不要在 fork 出来的子进程搞。
2、Windows 平台可以通过 CreateProcess 函数来创建新的进程,在把自己结束退出就可以了,还有一个办法是比较暗黑的做法,就是通过替换进程的内存来实现替换进程,但容易被杀毒软件爆毒,就是 Windows 平台上的替换进程技术。
源实现大概是这样的。
#if defined(_WIN32)
ppp::string command_line = "\"" + ppp::string(*argv) + "\"";
for (int i = 1; i < argc; ++i)
{
command_line += " \"" + ppp::string(argv[i]) + "\"";
}
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (CreateProcessA(NULL, command_line.data(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
#else
execvp(*argv, (char**)argv);
#endif