C++ 在进程杀死其父进程后保持进程活动状态
C++ Keep process alive after it kills its parent
我正在努力为OS X上的守护进程实现一个自我更新程序。更新作为.pkg文件发布,因此我尝试执行以下操作:当守护程序收到更新可用的通知时,它会通过 system() 调用调用安装程序来安装软件包。该软件包包含较新版本的守护程序、停止守护程序的升级前脚本 (launchctl unload /Library/LaunchDaemons/foo.plist
),以及一个在安装新版本后启动备份的飞行后脚本。我遇到的问题是安装程序进程过早退出。我怀疑这可能是因为安装程序杀死了它的父进程以更新它,然后被杀死了自己,而不是继续作为自己的孤立进程。我尝试了以下方法,但没有运气:
- 在
- 安装程序命令后加上"&"以在背景
- 使用 nohup 包装安装程序命令
当我从命令行运行安装命令时,安装命令始终如一地完成而没有错误,并且在从安装程序运行时始终失败。当从安装程序调用时,我将输出管道传输到一个文件,有时它什么都没有,有时它显示安装在输出停止之前完成大约 41%。关于我如何弄清楚该过程发生了什么或确保它在没有父级的情况下保持活力的任何想法?
当你调用 launchctl unload
时,它会杀死整个进程组(不像一个简单的kill
)。您希望将子流程移动到单独的流程组中。最简单的方法是使用 C 调用setsid()
。
如果您正在 shell 脚本中,则应查看以下方法。自从我处理 C 程序以来,我还没有尝试过这些,并且可以setsid()
:
- 在调用安装程序之前,请使用
set -m
。这应该打开监视器模式,该模式显示"后台进程在单独的进程组中运行,并在完成后打印包含其退出状态的行。 - 试试这个子交互 shell 技巧:shell 脚本中的新进程组
相关文章:
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 在使用 gSoap 链接多个 SOAP 服务时启用保持活动状态
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 如何确定boost msm中的特定状态是否为活动状态
- C++简单的示例,但为什么进程以状态 -1073741510 终止
- GCC (libstdc++) 运行时如何在异常处于活动状态时决定终止 ()
- “B1的多重定义”,即使警卫处于活动状态
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 当 /Whorearchive选项处于活动状态时,无法使用Visual Studio链接到Windows上的自构建张量
- 进程以状态 -1073741571 终止(0 分钟、3 秒)
- IBM Rhapsody c++ 代码生成 - 为什么总是在状态图周围放置一个活动状态
- C++进程以状态 -1073741819 终止
- 暂停游戏OnSteamVR叠加层处于活动状态
- 我怎么知道哪种上下文处于活动状态
- 如何防止我的dll在某个进程未处于活动状态时运行
- 在子进程处于活动状态时读取子进程的输出
- 如何使进程B仅在进程A处于活动状态时运行
- C++ 在进程杀死其父进程后保持进程活动状态
- 在Linux/ c++中,发送给线程/进程的信号是否使其变为活动状态?