c – 隔离崩溃(SEGV)但将关键遗留代码加速到单独的二进制文件中

我有一个代码库(主要是C)经过充分测试和无崩溃.大多.代码的一部分 – 不可替代,难以维护或改进,并且链接到仅二进制库* – 会导致所有崩溃.这些并不经常发生,但是当它们发生时,整个程序崩溃了.

          +----------------------+
          | Shiny new sane       |
          |  code base           |
          |                      |
          |  +-----------------+ |   If the legacy code crashes,
          |  |                 | |   the entire program does, too.
          |  |   Legacy Code   | |
          |  | * Crash prone * | |
          |  | int abc(data)   | |
          |  +-----------------+ |
          |                      |
          +----------------------+

是否有可能将代码的这一部分提取到一个单独的程序中,从主程序启动,在这些程序之间移动数据(在Linux,OS X和Windows,如果可能的话,Windows),容忍子进程崩溃并重新启动孩子?像这样的东西:

        +----------------+         // start,
        | Shiny new sane | ------. // re-start on crash
        |  code base     |       | //   and
        |                |       v // input data
        |                |    +-----------------+
        |   return       |    |                 |
        |   results <-------- |   Legacy Code   |
        +----------------+    | * Crash prone * |
                              |  int abc(data)  |
       (or not results        +-----------------+
        because abc crashed)

理想情况下,通信速度足够快,以便可以使用包装器透明地替换对int abc(char * data)的同步调用(假设非崩溃情况).由于轻微的内存泄漏,遗留程序应该每小时左右重新启动一次.崩溃是确定性的,因此不应发送两次错误的输入数据.

代码库是C 11和C,值得注意的外部库是Qt和boost.它运行在Linux,OSX和Windows上.


*:某些崩溃/泄漏源于此库,没有可用的源代码.

最佳答案 好吧,如果我是你,我不会从这里开始……

但是,你就在你身边.是的,你可以做到.您将不得不序列化您的输入参数,发送它们,在子进程中反序列化它们,运行函数,序列化输出,返回它们,然后反序列化它们. Boost将提供许多有用的代码来帮助解决这个问题(请参阅asio).

全局变量将使生活更加“有趣”.遗留代码是否使用Qt? – 这可能不会被分成两个过程.

如果你只使用Windows,我会说“使用DCOM” – 它使这非常简单.

如果仅使用一个线程来处理遗留物(处理“返回”的代码只是查看是否需要重新启动,并且杀死进程,那么重新启动就足够了.)如果你有多个线程,那么闪亮的代码将需要检查是否需要重新启动,阻止任何其他线程,等待所有调用都返回,重新启动进程,然后取消阻止所有内容.

Boost::interprocess看起来拥有通信所需的一切 – 它有共享内存,互斥锁和条件变量. Boost :: serialization将完成编组和解组的工作.

点赞