如何独立多次加载共享对象
Posted
技术标签:
【中文标题】如何独立多次加载共享对象【英文标题】:How to load a shared object multiple times independently 【发布时间】:2014-01-24 08:48:27 【问题描述】:我的任务是设计一个小型守护程序(在 Debian Linux 上),它将使用黑盒 libfoo.so 与外部 EFT 终端进行通信。有几个相同的 EFT 终端(大约 100 个),一个 libfoo.so 实例只能与一个终端通信。有一个 init 调用实质上将实例绑定到终端。
我们公司主要使用 Java,但这可能需要 C++ 实现。编程语言尚未定义。
由于我们需要处理与多个终端的并发通信(大约 10 个并发线程),我们需要加载 libfoo.so 的多个实例。我正在寻找如何解决这种要求的设计原则(dlopen 只会加载一次 SO,JNI 也是如此)。我需要产生子进程吗?复制/粘贴 SO 并将其命名为 libfoo_1.so、libfoo_2.so 等(唉!)还有其他解决方案吗?
谢谢
西蒙
【问题讨论】:
当您说“黑盒”时,您的意思是共享对象没有任何 API 吗? 很抱歉在使用“黑盒”时不精确。 SO 确实有 API,但是我们没有源代码,无法影响 API。 【参考方案1】:如果库没有 API,这意味着它使用 .init mechanism 运行其代码,那么您没有比 fork 父进程并在子进程中 dlopen 库更好的选择。
这其实很简单,只要你记得wait 让你的子进程在需要时终止。
如果您需要处理父进程和子进程之间的通信,可以使用多种Inter-process Communication 方法,例如pipes。
【讨论】:
感谢您确认子进程是可行的方法。以上是关于如何独立多次加载共享对象的主要内容,如果未能解决你的问题,请参考以下文章
如何将绘图仪表板应用程序导出到 html 独立文件以与其他人共享?