运行 一个应用程序,以便携的方式忘记

Run an app and forget in a portable way

我正在编写一个从主程序调用的小型更新实用程序。主程序在调用后立即终止,让更新程序复制所有更新的文件,然后它应该重新启动主程序。然而,最后一点开始让我头疼了。

我可以 运行 使用 std::system 的程序(我知道,不安全,但可移植)就好了,但是更新程序只是挂在那里等待主程序完成。我正在寻找调用 fire & forget 的方法,线程似乎是最好的主意。

但是这样:

std::system("app");

挂起更新程序,因为它等待 return 来自 system。而这个:

std::thread(std::system, "app").detach();

无变体

std::thread t(std::system, "app");
t.detach();

似乎无所不能。但是当我加入线程时:

std::thread t(std::system, "app");
t.join();

它执行 运行 应用程序,但仍像在原始代码中一样等待其 return。为什么分离的线程不能 运行 应用程序?

我会围绕不同的实现使用 ifdef 块。对于 Windows 你可以使用 CreateProcess,linux(可能 Mac)支持 POSIX popen / fork 方法。

std::system 并不能真正使您的程序具有可移植性,通常在 shell 上调用事物的语法因平台而异,您最终还是会得到依赖于平台的代码。

Linux中有详细的操作教程: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx

任何线程,无论是否分离,都会在其进程完成后死亡(在大多数系统上)。在更新程序结束执行之前给一些时间,线程可能能够真正进行调用:

#include <chrono>
#include <cstdlib>
#include <thread>

void do_app() {
  std::system("app");
}

int main() {
  std::thread(do_app).detach();
  std::this_thread::sleep_for(std::chrono::seconds(2));
}