我目前正在使用 GLib g_module
函数在运行时加载一些共享对象。
我使用的基本方法如下:
- 调用
g_module_open
获取模块 - 之后调用
g_module_make_resident
- 使用
g_module_symbol
加载符号
因为我使用它作为添加插件兼容性的基本方法,我很感兴趣是否有一种好的方法来确保即使加载的模块有错误(比如内存损坏(malloc
/free
)) 主应用程序可以在不崩溃的情况下“捕获”这个错误吗?
我真的不想让你写任何代码,我只是想知道有没有好的方法来实现这个……
最佳答案
正如 Severin 所提到的,实际上没有任何事情可以轻松完成。也就是说,您确实有几个选择:
您可能要考虑的第一件事是使用类似 libpeas 的东西,它允许您使用非 C 链接的语言(JavaScript、Python 等)加载插件。许多这些语言提供的安全性比 C 高得多,因此如果您试图防止程序员错误(而不是恶意模块),这可能是一个不错的方法。
实现此目的的另一种相对直接的方法是在单独的进程中运行每个插件。您可以通过 D-Bus、管道等进行通信。这种方法的一个优点是某些模块可以拥有较少的权限;如果您有一个与可能需要 root 权限的硬件交互的程序,但您的 UI 仍可以作为非特权用户运行。心灵感应是这种架构的一个例子。
关于c - 加载共享对象的故障安全方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122978/