【问题标题】:C++'s "system" without wait (Win32)C++ 的“系统”无需等待(Win32)
【发布时间】:2012-02-27 23:17:36
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ windows background execute


【解决方案1】:

使用CreateProcess(),它异步运行。然后您只需要确保 updater.exe 可以写入原始 EXE,您可以通过等待或重试直到原始进程结束来做到这一点。 (当然有宽限期。)

【讨论】:

    【解决方案2】:

    Win32 中没有fork()。您正在查找的 API 调用称为 ::CreateProcess()。这是 system() 使用的底层函数。 ::CreateProcess() 本质上是异步的:除非您专门等待返回的进程句柄,否则调用是非阻塞的。

    还有一个更高级别的函数::ShellExecute(),如果您不重定向进程标准 I/O 或等待进程,您可以使用它。这具有在系统 PATH 中搜索可执行文件的优势,以及启动批处理文件甚至启动与文档文件关联的程序的能力。

    【讨论】:

      【解决方案3】:

      你需要一个线程 看这里: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 上测试

      【讨论】:

      • 首先,据我所知, execl() 不是 Windows 的一部分,其次,你也不需要 fork() 吗?据我所知,这些仅在 Cygwin 和 MKS 中存在于 Windows 上。
      • 我已经使用 GCC 作为编译器在 Windows 上测试了代码,效果很好。我没有安装 Visual C++ 但他们为什么不支持它,通常也可以? fork() 是另一种线程(unix 风格的简单线程)。 execl 将进程映像替换为新映像。据我了解,OP 这就是他试图做的。
      • 你使用的GCC不是Cygwin吗?那里有很多参考资料,但要给出一个 SO 参考资料:stackoverflow.com/questions/23397/…
      • 不,这是一个普通的 mingw gcc 编译器。我会说很标准。我的例子不适合你吗?
      • 该代码不可移植。在 UNIX 上,您必须在它之前有一个 fork(),否则您仍将使用相同的进程并锁定 exe。在 Windows 上,它似乎有点可能工作,但只是偶然。参见例如mingw-users.1079350.n2.nabble.com/… 另外 execl() 不是 Windows API,但可能是 Mingw 正在添加的东西。您提供的 MSDN 链接没有说明 execl(),我不知道您为什么包含它。我没有测试你的代码,我现在没有工具。你在 Visual Studio 中测试过吗?我认为 execl() 只是 mingw
      猜你喜欢
      • 1970-01-01
      • 2015-03-27
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多