我正在编写一个从主程序调用的小型更新程序实用程序。主程序在调用之后立即终止,让更新程序复制所有更新的文件,然后重新启动主程序。然而,最后一点开始让我头疼。
我可以使用std::system
运行程序(我知道,不安全,但是可移植)就好了,但是更新程序只是挂在那里等待主程序完成。我正在寻找打电话的方法 fire&忘了,线程似乎是最好的主意。
但是这个:
std::system("app");
在等待从system
返回时挂起更新程序。鉴于此:
std::thread(std::system, "app").detach();
也不是变种
std::thread t(std::system, "app");
t.detach();
似乎做了什么。但是当我加入线程时:
std::thread t(std::system, "app");
t.join();
它确实运行了应用程序,但仍然像原始代码一样等待它的返回。为什么分离的线程不能运行应用程序?
答案 0 :(得分:2)
任何线程,无论是否分离,如果其进程完成(在大多数系统上)将会死亡。在更新程序结束执行之前给出一些时间,并且线程可能能够实际进行调用:
#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));
}
答案 1 :(得分:1)
我只是在不同的实现中使用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