2013-04-03 142 views
8

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

的插件可能会从各种渠道进来的,值得信赖的或不那么:)

现在,我想确保,如果一个插件做一些愚蠢的事(如试图释放他是一个记忆不应该自由),但这一行为并没有降低整个系统的效能,只是通知主系统关于该行为不当的插件,以便将其从队列中移除。

调用以下方式正在做的代码:

const char* data = get_my_data(); 
for(int i = 0; i<plugins; i++) 
{ 
    plugins[i]->execute(data); 
} 

但如果plugin[0]的FreeS“意外”的数据字符串或覆盖,或错误地跳转到地址0x0这会搞垮整个系统,我不想要这个。我怎样才能避免这种灾难。 (我知道,我可以复制data字符串......这并不能解决我的问题:))

+0

我的回答有助于你解决这个问题吗?如果是这样,请接受它作为正确答案。 –

回答

12

为插件创建一个包装进程并通过IPC与该包装进行通信。 在插件失败的情况下,您的主要过程将不会被触动

0

简而言之,您不能在同一个过程中这样做。如果你的插件是用C或C++编写的,它们可能包含大量未定义行为的来源,这意味着无法检测到不可避免的崩溃。因此,您应该在自己的流程中启动插件,例如kassak建议的插件,并让它们在需要时崩溃,或者为插件使用其他语言,例如一些像lua这样的解释性脚本语言。

-1

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

我用/ EHA在我的项目之一,以帮助我抓住从做愚蠢的事情库例外。如果你用这个设置编译你的代码,一个正常的try catch块会捕获异常,例如由零等devide。

不知道在Linux上是否有一些等价物 - 请让我知道如果有..