我有一个作为linux服务运行的C++程序。该程序的一些命令行选项只需在其配置文件中设置值,然后退出,这就需要重新启动服务来获取新的配置。为了使服务继续不间断地运行,它的工作方式如下:
当程序在读取新配置后重新启动时,我将调用execv,以便它将保持与原始实例相同的进程空间,从而可以继续作为服务进行管理。问题是execv的行为并不像预期的那样,而是终止现有的进程并在新的进程中重新启动。由于PID不再匹配,如果在此之后尝试运行‘服务progname stop/restart’,它将不能正常工作,'stop‘将使服务继续运行,'restart’将生成程序的一个重复实例。
我已经确认,将argv传递给execv是可执行文件的完整路径,所以它不应该通过shell在路径中搜索可执行文件(这也应该因为我使用execv而不是execvp这一事实而被阻止),因为我已经阅读了在其他应用程序中引起类似问题的文章。
发布于 2012-12-18 22:20:03
发现问题时,问题是程序在启动时使用守护进程(),这在内部执行叉/exec,在重新启动程序时再次调用daemon()。在增强它以区分开始/重新启动和避免再次调用守护进程()之后,问题就解决了。
https://stackoverflow.com/questions/13938736
复制相似问题