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);}
#elseexecvp(*argv, (char**)argv);
#endif