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

时间:2012-12-18 17:56:28

标签: c++ process exec

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

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

当程序在读取新配置后重新启动时,我正在调用execv,使其保持与原始实例相同的进程空间,以便它可以继续作为服务进行管理。问题是execv没有按预期运行,而是终止现有流程并重新启动新流程。因为PID不再匹配,如果我在此之后尝试运行'service progname stop / restart',它将无法正常工作,'stop'将使服务保持运行,'restart'将产生一个重复的程序实例

我已经确认传递给execv的argv [0]是可执行文件的完整路径,因此它不应该通过shell在PATH中搜索可执行文件(这也应该是因为我'我使用execv代替execvp),我已经读到了在其他应用程序中引起类似问题。

1 个答案:

答案 0 :(得分:0)

发现问题,问题是程序在启动时使用daemon(),它在内部执行fork / exec,并且在重新启动程序时它再次调用daemon()。在增强它以区分启动/重启并避免再次调用守护进程()之后,问题就解决了。