我有一个作为 linux 服务运行的 C++ 程序。某些程序的命令行选项只是在其配置文件中设置值然后退出,然后需要重新启动服务以获取新配置。为了让服务继续不间断地运行,它的工作原理如下:
- 后台服务在系统启动时启动
- 后台服务创建一个“配置看门狗”线程监控配置文件
- 用户从命令行运行“progname 选项”
- 配置文件修改
- 程序退出的命令行实例
- 后台服务配置看门狗线程检测到配置更改,触发重启
当程序在读取新配置后重新启动时,我正在调用 execv 以便它将与原始实例保持在同一进程空间中,以便它可以继续作为服务进行管理。问题是 execv 没有按预期运行,而是终止现有进程并在新进程中重新启动。因为 PID 不再匹配,如果我在此之后尝试运行“service progname stop/restart”,它将无法正常工作,“stop”将使服务继续运行,“restart”将产生程序的重复实例.
我已经确认传递给 execv 的 argv[0] 是可执行文件的完整路径,因此它不应该通过 shell 在 PATH 中搜索可执行文件(这也应该被我使用 execv 的事实所阻止而不是 execvp) 我读过的关于在其他应用程序中引起类似问题的文章。