繁体   English   中英

C ++:execv / execvp不使用现有的PID

[英]C++: execv/execvp not using existing PID

我有一个作为Linux服务运行的C ++程序。 该程序的某些命令行选项只是在其配置文件中设置值,然后退出,然后退出该服务,然后重新启动服务以选择新的配置。 为了使服务能够不间断地继续运行,其工作方式如下:

  • 后台服务在系统启动时启动
    • 后台服务创建一个“ config watchdog”线程监视配置文件
  • 用户从命令行运行“ progname选项”
    • 配置文件已修改
    • 程序退出的命令行实例
    • 后台服务配置看门狗线程检测到配置更改,触发重新启动

当程序在读取新配置后重新启动时,我正在调用execv,以便它将与原始实例保持在相同的进程空间中,以便可以继续将其作为服务进行管理。 问题在于execv的行为不符合预期,而是终止了现有进程并重新启动了新进程。 由于PID不再匹配,因此,如果我在此之后尝试运行“服务程序名停止/重新启动”,它将无法正常工作,“停止”将使服务保持运行状态,并且“重新启动”将产生该程序的重​​复实例。

我已经确认传递给execv的argv [0]是可执行文件的完整路径,因此它不应通过外壳在PATH中搜索可执行文件(这也应通过我正在使用execv的事实来避免。而不是execvp),而我已经读过有关在其他应用程序中引起类似问题的信息。

发现了问题,问题在于该程序在启动时使用daemon(),该程序在内部执行fork / exec,而在重新启动程序时,它再次调用daemon()。 增强它以区分启动/重新启动并避免再次调用daemon()后,此问题已解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM