C ++的“系统”无需等待(Win32)

时间:2012-02-06 13:32:26

标签: c++ windows background execute

我有一个程序可以检查服务器上是否有版本更新。现在我必须做类似

的事情
if(update_avail) {
    system("updater.exe");
    exit(0);
}

但无需等待“updater.exe”完成。否则我无法替换我的主程序,因为它正在运行。那么如何执行“updater.exe”并立即退出?我知道使用fork的* nix方式等等,如何在Windows中执行此操作?

3 个答案:

答案 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上测试