我正在使用GLib g_module
函数在运行时加载一些共享对象。
我使用的基本方法如下:
g_module_open
以获取模块g_module_make_resident
g_module_symbol
由于我使用它作为添加插件兼容性的基本方法,我感兴趣的是,如果有一个好方法可以确保即使加载的模块有错误(如内存损坏(malloc
/ { {1}}))主要应用程序可以“抓住”#39;这个错误没有崩溃一切?
我真的不想让你写任何代码,我只是感兴趣,如果有一个很好的方法来实现这个...
答案 0 :(得分:2)
正如Severin所说,你真的无法做任何事情。也就是说,你有几个选择:
您可能想要考虑的第一件事是使用类似libpeas的东西,它允许您使用非C链接(JavaScript,Python等)加载语言插件。其中许多语言提供的安全性远远高于C,因此如果您尝试防范程序员错误(而不是恶意模块),这可能是一个很好的方法。
另一种相对简单的方法是在单独的进程中运行每个插件。您可以通过D-Bus,管道等进行通信。这种方法的一个优点是某些模块可以拥有较少的权限;如果您有一个与可能需要root权限的硬件交互的程序,但您的UI仍然可以作为非特权用户运行。心灵感应就是这种架构的一个例子。