C++ 在进程杀死其父进程后保持进程活动状态

C++ Keep process alive after it kills its parent

本文关键字:进程 活动状态 C++      更新时间:2023-10-16

我正在努力为OS X上的守护进程实现一个自我更新程序。更新作为.pkg文件发布,因此我尝试执行以下操作:当守护程序收到更新可用的通知时,它会通过 system() 调用调用安装程序来安装软件包。该软件包包含较新版本的守护程序、停止守护程序的升级前脚本 (launchctl unload /Library/LaunchDaemons/foo.plist ),以及一个在安装新版本后启动备份的飞行后脚本。我遇到的问题是安装程序进程过早退出。我怀疑这可能是因为安装程序杀死了它的父进程以更新它,然后被杀死了自己,而不是继续作为自己的孤立进程。我尝试了以下方法,但没有运气:

  • 安装程序命令后加上"&"以在背景
  • 使用 nohup 包装安装程序命令

当我从命令行运行安装命令时,安装命令始终如一地完成而没有错误,并且在从安装程序运行时始终失败。当从安装程序调用时,我将输出管道传输到一个文件,有时它什么都没有,有时它显示安装在输出停止之前完成大约 41%。关于我如何弄清楚该过程发生了什么或确保它在没有父级的情况下保持活力的任何想法?

当你调用 launchctl unload 时,它会杀死整个进程组(不像一个简单的kill)。您希望将子流程移动到单独的流程组中。最简单的方法是使用 C 调用setsid()

如果您正在 shell 脚本中,则应查看以下方法。自从我处理 C 程序以来,我还没有尝试过这些,并且可以setsid()

  • 在调用安装程序之前,请使用 set -m 。这应该打开监视器模式,该模式显示"后台进程在单独的进程组中运行,并在完成后打印包含其退出状态的行。
  • 试试这个子交互 shell 技巧:shell 脚本中的新进程组