gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:28 25 4
gpt4 key购买 nike

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

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

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

我已经确认传递给 execv 的 argv[0] 是可执行文件的完整路径,所以它不应该通过 shell 在 PATH 中搜索可执行文件(这也应该被我阻止的事实阻止)我使用的是 execv 而不是 execvp),我读过它会在其他应用程序中引起类似的问题。

最佳答案

找到问题了,问题是程序在启动时使用了 daemon(),它在内部执行了一个 fork/exec,当重新启动程序时它又调用了 daemon()。增强区分启动/重启,避免再次调用daemon()后,问题得到解决。

关于C++:execv/execvp 不使用现有的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com