我正在用 C++ 编写网络应用程序,我想启用制作插件,但我不知道该怎么做,以保护我的应用程序免受段错误等错误的影响。例如: 我有界面:
class IPlugin{
public:
IPlugin();
virtual ~IPlugin();
virtual void callPlugin() = 0;
}
然后有人会写动态库:
class Plugin : public IPlugin{
public:
Plugin();
virtual ~Plugin();
virtual void callPlugin();
}
void Plugin::callPlugin(){
int* a = NULL;
*a = 5;
}
在我的应用程序中调用此函数将终止一切。我知道我可以使用fork(),但是插件中的函数会很短并且会被多次使用,所以我认为fork() 太慢了。有什么想法吗?
附言。对不起我的英语。
最佳答案
试图保护您免受加载到您的地址空间中的错误代码的影响,这是一场失败的战斗。这些插件可能会造成您永远无法恢复的真正损害。
要么接受有问题的插件会导致您的应用程序崩溃的事实,要么您必须按照您的建议将插件隔离在一个单独的进程中。但是你只需要调用 fork 一次,当你加载插件时,不用担心它会很慢。真正的工作是使用某种形式的 IPC 从您的应用程序与插件进行通信 - 管道可能是合适的。
关于C++ 动态库段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297006/