2013-04-03 2 views
8

Я проектирую систему в C/C++, которая расширяется со всеми типами плагинов. Существует хорошо определенный C public API, который в основном работает с (const) char* и другими типами указателей. Плагины скомпилированы в файлы .so или .dll, и основное приложение загружает их при запуске, а затем выгружает или перезагружает их по запросу.Запуск плагинов в песочнице

Плагины могут прийти в различных источниках, надёжный и не так :)

Теперь я хотел бы, чтобы убедиться, что если один плагин делает что-то глупое (например, пытается освободить память, которую он был не должен освобождаться), это действие не разрушает всю систему, а просто замечает основную систему о неверном плагине для него, чтобы удалить ее из очереди.

Код вызовов делается следующим образом:

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

но если plugin[0] освобождает «от несчастного случая» строки данных или перезаписывает или по ошибке перескакивает на адрес 0x0 это принесет бы вниз всю систему , и я не хочу этого. Как я могу избежать такой катастрофы. (Я знаю, я могу дублировать строку data ... это не решает мою проблему :))

+0

Помог ли мой ответ? Если да, примите его как правильный ответ. –

ответ

12

Сделайте процесс обертки для плагина и общайтесь с этой оболочкой через IPC. В случае отказа плагина основной процесс будет не затронут

0

Проще говоря, вы не можете сделать это в том же процессе. Если ваши плагины написаны на C или C++, они могут содержать многочисленные источники неопределенного поведения, что означает источники необнаружимых неизбежных сбоев. Поэтому вы должны либо запускать плагины в своих собственных процессах, как предлагаемые kassak, и позволить им сбой, если они захотят, или использовать другой язык для ваших плагинов, например. какой-то интуитивный язык сценариев, например, lua.

-1

Посмотрите http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

я использую/Пьеха в одном из моих проектов, чтобы помочь мне поймать исключений из библиотек, которые делают глупые вещи. Если вы скомпилируете свой код с этим параметром, обычный блок catch catch поймает исключения, такие как деление на ноль и т. Д.

Не уверен, есть ли какой-то эквивалент для этого в Linux - сообщите мне, если есть ..

Смежные вопросы