我有一个程序,检查服务器上是否有版本更新。 现在我必须做一些类似的事情
if(update_avail) { system("updater.exe"); exit(0); }
但没有等待“updater.exe”来完成。 否则,我不能代替我的主程序,因为它正在运行。 那么如何执行“updater.exe”并立即退出? 我知道用fork
等* nix的方式,如何在Windows中做到这一点?
使用CreateProcess() ,它异步运行。 那么你只需要确保updater.exe可以写入到原来的EXE,你可以通过等待或重试直到原来的进程结束。 (当然有宽限期。)
在Win32中没有fork()
。 您正在查找的API调用称为::CreateProcess()
。 这是system()正在使用的基础函数。 ::CreateProcess()
本质上是异步的:除非你正在等待返回的进程句柄,否则调用是非阻塞的。
还有一个更高级别的函数::ShellExecute()
,如果你没有重定向进程标准I / O或者在进程中等待的话,你可以使用它。 这有一个优点,即搜索可执行文件的系统路径,以及启动批处理文件甚至启动与文档文件关联的程序的能力。
你需要一个线程看看这里: http : //msdn.microsoft.com/en-us/library/y6h8hye8(v=vs.80).aspx你目前正在写你的代码在“主线程”(通常也是你的框架代码)。 所以,如果你运行一些需要时间来完成的事情,它会停止你的主线程的执行,如果你在第二个线程中运行它,你的主线程将会继续。
更新:我错过了你想立即退出的部分。 execl()可能是你想要的。
#include <unistd.h> int main(){ execl("C:\\path\\to\\updater.exe", (const char *) 0); return 0; }
建议的CreateProcess()也可以使用,但execl符合POSIX,并保持您的代码更便携(如果你在乎的话)。
#include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...);
更新:在Win-7上使用gcc作为编译器进行测试