[英]C++: execv/execvp not using existing PID
我有一个作为Linux服务运行的C ++程序。 该程序的某些命令行选项只是在其配置文件中设置值,然后退出,然后退出该服务,然后重新启动服务以选择新的配置。 为了使服务能够不间断地继续运行,其工作方式如下:
当程序在读取新配置后重新启动时,我正在调用execv,以便它将与原始实例保持在相同的进程空间中,以便可以继续将其作为服务进行管理。 问题在于execv的行为不符合预期,而是终止了现有进程并重新启动了新进程。 由于PID不再匹配,因此,如果我在此之后尝试运行“服务程序名停止/重新启动”,它将无法正常工作,“停止”将使服务保持运行状态,并且“重新启动”将产生该程序的重复实例。
我已经确认传递给execv的argv [0]是可执行文件的完整路径,因此它不应通过外壳在PATH中搜索可执行文件(这也应通过我正在使用execv的事实来避免。而不是execvp),而我已经读过有关在其他应用程序中引起类似问题的信息。
发现了问题,问题在于该程序在启动时使用daemon(),该程序在内部执行fork / exec,而在重新启动程序时,它再次调用daemon()。 增强它以区分启动/重新启动并避免再次调用daemon()后,此问题已解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.