【问题标题】:Avoid main process crash on plugin crash [closed]避免插件崩溃时主进程崩溃[关闭]
【发布时间】:2021-10-03 22:03:10
【问题描述】:

我正在为我的另一个项目试验一种插件系统,主要用 C 和少量 C++ 编写。

假设某个开发人员创建了一个插件(可以说是派生类!)崩溃,它可能导致整个程序崩溃。

这个设计只能在 linux 上运行!

我设定的基本要求如下,

  1. 插件入口函数提供了它需要的所有数据。
  2. 插件不需要返回任何数据或返回通信。但应该允许这样做。
  3. 如果插件函数导致分段错误或遇到signal,它不得影响主程序。

为此,我正在考虑一些方法,我需要更多的意见和建议,

  1. 使用fork(),在调用插件入口函数之前派生进程并与套接字或映射内存通信。
  2. 使用threads(),我认为这不起作用,因为线程不是单独的进程,并且在诸如分段错误之类的事情上,它也会使主线程崩溃。
  3. 使用clone()/clone3(),这对我来说很新鲜。但它的工作原理与 fork 类似,但可以更好地控制克隆过程。

还有什么我应该考虑的想法或事情吗?

【问题讨论】:

    标签: c++ c linux unix


    【解决方案1】:

    当您在自己的地址空间和您自己的用户帐户下添加外部内容时,它与您的应用程序具有相同的权限。

    因此,您在代码中提出的任何限制都可能在您不知情的情况下被插件覆盖。

    如果安全是重中之重,那么您唯一可行的选择是将插件托管到一个外部进程中,该进程将以安全的方式与主进程进行通信。如果由于任何原因插件死机或导致崩溃,则只有托管外部进程受到影响。

    在线程中,使线程崩溃允许您仅终止该线程,应用程序的其余部分可能不会受到影响 - 但可能会有副作用,因为它是相同的地址空间。

    我不是 unix 开发人员(我只在 Windows 中工作),但那里的想法是一样的。我有一个托管(VST 音频)插件的外部客户端应用程序,如果出现问题,我会终止该外部进程。

    【讨论】:

    • 安全和内存隔离不会是我的首要任务,所有这些插件将只包含通知其他进程统计信息等的小实用功能..
    • 那么我猜线程系统会很好。这还取决于谁在编写您的插件。
    【解决方案2】:

    不久前我遇到了同样的问题,我们有一个据说很稳定的程序,但由于它对系统非常重要,我们需要一种方法来绝对确保它会一直运行。

    我创建了一个“主管”程序,它使用 fork() 和 execv() 在新进程中启动新的二进制文件,并使用 waitpid() 检查它是否崩溃,这样,如果它以任何方式因任何原因而崩溃可能(当然,只要它没有导致系统崩溃)父进程会知道但仍然可以继续正常工作。

    由于您需要在两个进程之间进行通信,我可能会建议使用 UNIX 套接字,因为它的开销非常低,如果您愿意,也可以轻松移植到网络,并增加内存映射的安全性。

    【讨论】:

      【解决方案3】:

      这设计为仅在 linux 上运行!

      只需从一开始就设计具有进程间通信的插件系统。服务器侦听套接字,插件是单独的进程,它们将要执行的命令发送到套接字并通过它与服务器通信。实现一个 C 接口库以简化对套接字的访问,也可供其他编程语言使用。这样一来,服务器就可以完全控制它的动作,并且如果你不想的话,它永远不会崩溃。

      X 服务器是这种通信的主要例子。 Xorg 与/tmp/.X11-unix/X0 通信。

      【讨论】:

      • 因为我只想在收到有关 mqtt 主题的消息时执行这些插件功能。我正在为低资源便携式路由器开发这个。所以如果我必须为每个插件创建单独的二进制文件,我认为它会不必要地增加所需的空间。每个插件都可以链接到 json-c、libmosquitto、其他 libuci 等,所以如果我可以将所有插件的代码放在一个地方会更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 2018-10-22
      • 2014-07-16
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多