我有一个代码库(主要是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将完成编组和解组的工作.