运行 一个应用程序,以便携的方式忘记
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));
}
我正在编写一个从主程序调用的小型更新实用程序。主程序在调用后立即终止,让更新程序复制所有更新的文件,然后它应该重新启动主程序。然而,最后一点开始让我头疼了。
我可以 运行 使用 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));
}