使用exec()调用子进程时存在Windows服务

时间:2010-12-09 15:53:15

标签: winapi windows-services execv

我有一个旨在成为Windows服务的C ++ Windows应用程序。它会定期执行更新程序以查看是否有新版本。要执行更新程序,请使用_execv()。更新程序查找新版本,下载它们并停止Windows服务(记录所有这些操作),替换文件,然后再次启动服务。在CLI模式下执行此操作(不进入服务模式)可以正常工作。根据我的日志文件,启动子进程,但父进程(Windows服务)退出。

甚至“允许”在Windows服务中启动子进程,以及为什么服务意外退出呢?我的日志文件没有显示错误(我甚至监视写入日志的段错误等。)

2 个答案:

答案 0 :(得分:1)

为什么使用_execv()而不是以Windows方式使用CreateProcess()

我假设您已经对您的服务进行了一些调试,但是您没有超出在服务中调用_execv()的程度?

答案 1 :(得分:1)

_execv 使用您传递的文件作为参数替换现有流程。在Unix(和类似)下直接/本地处理。但是,Windows并不直接支持 - 所以通过让父进程退出并安排子进程一旦启动就可以完成。

IOW,听起来像_execv正在完成它的设计 - 但在这种情况下,它可能不是你真正想要的。您可以从服务生成流程,但是您通常希望使用CreateProcessAsUser在指定帐户下创建它而不是服务帐户(具有分配给它的相当不寻常的权限集)。当更新程序调用{​​{3}},ControlService等时,服务经理会要求服务进程退出并重新启动。