我有一个程序可以检查服务器上是否有版本更新。现在我必须做类似
的事情if(update_avail) {
system("updater.exe");
exit(0);
}
但无需等待“updater.exe”完成。否则我无法替换我的主程序,因为它正在运行。那么如何执行“updater.exe”并立即退出?我知道使用fork
的* nix方式等等,如何在Windows中执行此操作?
答案 0 :(得分:5)
使用CreateProcess(),它以异步方式运行。然后,您只需要确保updater.exe可以写入原始EXE,您可以通过等待或重试直到原始进程结束。 (当然有宽限期。)
答案 1 :(得分:4)
Win32中没有fork()
。您正在寻找的API调用称为::CreateProcess()
。这是system()使用的基础函数。 ::CreateProcess()
本质上是异步的:除非您专门等待返回的进程句柄,否则该调用是非阻塞的。
还有一个更高级别的函数::ShellExecute()
,如果您没有重定向进程标准I / O或正在等待进程,则可以使用它。这样做的好处是可以在系统PATH中搜索可执行文件,以及启动批处理文件甚至启动与文档文件关联的程序的能力。
答案 2 :(得分:0)
你需要一个线程 看这里: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, ...);
更新: 使用gcc作为编译器在Win-7上测试