在沙箱中运行插件

我正在设计一个C / C ++系统,它可以通过各种插件进行扩展。 有一个定义良好的C公共API,它主要使用(const) char*和其他指针类型。 插件被编译成.so或.dll文件,主应用程序在启动时加载它们,然后根据请求卸载或重新加载它们。

插件可能来自各种来源,可靠或不可信:)

现在,我想确保,如果一个插件做了一些愚蠢的事情(比如尝试释放他本不应该释放的内存),这个动作并没有打倒整个系统,而只是注意到主系统它的行为不端插件,以便从队列中删除它。

代码调用以下列方式完成:

 const char* data = get_my_data(); for(int i = 0; iexecute(data); } 

但如果plugin[0] “意外”释放数据字符串或覆盖它或错误地跳转到地址0x0这将导致整个系统崩溃,我不希望这样。 我怎样才能避免这种灾难。 (我知道,我可以复制data字符串……这不能解决我的问题:))

为插件创建一个包装器进程,并通过IPC与该包装器进行通信。 如果插件出现故障,您的主要流程将不会受到影响

简单地说,你不能在同一个过程中做到这一点。 如果您的插件是用C或C ++编写的,它们可能包含许多未定义行为的来源,这意味着无法检测到不可避免的崩溃。 因此,你应该在他们自己的进程中启动插件,如kassak建议的,如果他们想要让它们崩溃,或者使用其他语言插件,例如像lua这样的一些内置脚本语言。

看看http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

我在我的一个项目中使用/ EHa来帮助我从那些做愚蠢事情的库中捕获exception。 如果使用此设置编译代码,则正常的try catch块将捕获exception偏差等exception等。

不确定Linux上是否有相同的function – 请告诉我是否有…