【问题标题】:Windows Service exits when calling an child process using _execv()使用 _execv() 调用子进程时 Windows 服务退出
【发布时间】:2010-12-09 15:53:14
【问题描述】:

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

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

【问题讨论】:

    标签: winapi windows-services execv


    【解决方案1】:

    你为什么使用_execv()而不是用windows的方式使用CreateProcess()

    我假设您已经在服务中进行了一些调试,并且您没有超过在服务中调用 _execv() 的地步?

    【讨论】:

      【解决方案2】:

      _execv 用一个新的进程替换现有进程,该进程运行您作为参数传递的文件。在直接/本机处理的Unix(和类似的)下。然而,Windows 并不直接支持这一点——所以它是通过让父进程退出并安排子进程尽快启动来完成的。

      IOW,听起来_execv 完全按照它的设计目的去做——但在这种情况下,它可能不是你真正想要的。您可以从服务生成进程,但通常希望使用CreateProcessAsUser 在指定帐户而不是服务帐户下创建它(该帐户分配了一组相当不寻常的权限)。当您的更新程序调用ControlServiceCreateService 等时,服务进程将在服务管理器要求时退出并重新启动。

      【讨论】:

      • 我误解了 _execv() 的工作原理。 CreateProcessAsUser() 似乎正是我正在寻找的东西,谢谢。
      猜你喜欢
      • 2019-05-30
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多