2013-04-03 16 views
8

Projektuję system w C/C++, który można rozszerzyć za pomocą wszelkiego rodzaju wtyczek. Istnieje dobrze zdefiniowany publiczny API C, który w większości działa z (const) char* i innymi typami wskaźników. Wtyczki są kompilowane do plików .so lub .dll, a główna aplikacja ładuje je po uruchomieniu, a później rozładowuje lub przeładowuje je na żądanie.Uruchamianie wtyczek w piaskownicy

Wtyczki mogą pochodzić z różnych źródeł, wiarygodny, czy nie tak :)

Teraz chciałbym, aby upewnić się, że jeśli ktoś robi coś głupiego wtyczki (takie jak próbuje uwolnić pamięć który był nie powinno się go uwalniać), ta czynność nie powoduje zniszczenia całego systemu, a jedynie dostrzega główny system o niewłaściwie działającej wtyczce, aby usunąć go z kolejki.

Kod połączenia są wykonywane w następujący sposób:

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

ale jeśli plugin[0] FreeS „przez przypadek” ciąg danych lub zastąpienie go lub przez pomyłkę skacze zająć 0x0 przyniesie to w dół cały system , i nie chcę tego. Jak mogę uniknąć tego rodzaju katastrofy. (Wiem, że mogę zduplikować ciąg znaków data ... to nie rozwiąże mojego problemu :))

+0

Czy moja odpowiedź pomogła Ci rozwiązać ten problem? Jeśli tak, zaakceptuj to jako poprawną odpowiedź. –

Odpowiedz

12

Wykonaj proces otoki dla wtyczki i komunikuj się z tym opakowaniem przez IPC. W przypadku błędu wtyczki twój główny proces byłby nietknięty

0

Po prostu nie można tego zrobić w tym samym procesie. Jeśli twoje wtyczki są napisane w C lub C++, mogą zawierać wiele źródeł niezdefiniowanego zachowania, co oznacza źródła dla niewykrywalnych, nieuchronnych awarii. Powinno się więc uruchomić wtyczki we własnych procesach, takich jak zasugerowane przez Kassaka, i pozwolić im się zawiesić, jeśli tego chcą, lub użyć innego języka dla wtyczek, np. trochę intepretowanego języka skryptowego, takiego jak lua.

-1

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

używam/EHA w jednym z moich projektów, aby pomóc mi złapać wyjątki z bibliotek, które wykonują głupie rzeczy. Jeśli skompilujesz swój kod za pomocą tego ustawienia, normalny blok catch catch wychwyci wyjątki, takie jak devide, zero, itp.

Nie jestem pewien, czy istnieje odpowiednik tego w Linuksie - proszę dać mi znać, czy jest tam ...

Powiązane problemy