我有一个旨在成为Windows服务的C ++ Windows应用程序。它会定期执行更新程序以查看是否有新版本。要执行更新程序,请使用_execv()
。更新程序查找新版本,下载它们并停止Windows服务(记录所有这些操作),替换文件,然后再次启动服务。在CLI模式下执行此操作(不进入服务模式)可以正常工作。根据我的日志文件,启动子进程,但父进程(Windows服务)退出。
甚至“允许”在Windows服务中启动子进程,以及为什么服务意外退出呢?我的日志文件没有显示错误(我甚至监视写入日志的段错误等。)
答案 0 :(得分:1)
为什么使用_execv()
而不是以Windows方式使用CreateProcess()
?
我假设您已经对您的服务进行了一些调试,但是您没有超出在服务中调用_execv()
的程度?
答案 1 :(得分:1)
_execv
使用您传递的文件作为参数替换现有流程。在Unix(和类似)下直接/本地处理。但是,Windows并不直接支持 - 所以通过让父进程退出并安排子进程一旦启动就可以完成。
IOW,听起来像_execv
正在完成它的设计 - 但在这种情况下,它可能不是你真正想要的。您可以从服务生成流程,但是您通常希望使用CreateProcessAsUser
在指定帐户下创建它而不是服务帐户(具有分配给它的相当不寻常的权限集)。当更新程序调用{{3}},ControlService
等时,服务经理会要求服务进程退出并重新启动。