2016-05-09 20 views
1

Ich verwende derzeit die GLib g_module Funktionen, um einige gemeinsame Objekte während der Laufzeit zu laden.Failsafe Möglichkeit zum Laden freigegebenen Objekts

Der einfachste Weg, ich benutze, ist die folgende:

  1. Anruf g_module_open das Modul
  2. Danach rufen Symbole g_module_make_resident
  3. Last zu erhalten, indem g_module_symbol

Verwendung Wie ich bin Englisch: www.mplayerhq.hu/DOCS/HTML/en/menc-...d-mpeg4.html Wenn ich dies als eine grundlegende Möglichkeit benutze, Plug - in - Kompatibilität hinzuzufügen, interessiert mich, ob es einen guten Weg gibt, um sicherzustellen, dass selbst wenn das geladene Modul einen Fehler hat (wie Speicherbeschädigung (malloc/free)) die Hauptanwendung kann diesen Fehler "nur fangen", ohne alles zu stürzen?

ich wirklich nicht wollen, dass Sie keinen Code schreiben, ich bin nur daran interessiert, wenn es eine gute Möglichkeit ist, dies zu achive ...

+2

Gemeinsam genutzte Bibliotheken werden in den Prozessadressraum geladen. Also nein, du kannst deinen Prozess nicht wirklich von Fehlern in der gemeinsam genutzten Bibliothek isolieren –

+0

ah okay, das ist traurig, aber trotzdem danke;) Du solltest das eine Antwort geben ... – mame98

Antwort

2

Als Severin erwähnt, ist es nicht wirklich alles, was man leicht tun können. Das heißt, Sie haben ein paar Optionen:

Die erste Sache, die Sie in Betracht ziehen könnten, ist mit etwas wie libpeas, die Sie Plugins in Sprachen mit nicht-C-Verknüpfung (JavaScript, Python, etc.) laden können. Viele dieser Sprachen bieten viel mehr Sicherheit als C. Wenn Sie versuchen, sich vor Programmierfehlern zu schützen (im Gegensatz zu bösartigen Modulen), könnte dies ein guter Weg sein.

Der andere relativ einfache Weg, dies zu erreichen, wäre, jedes Plugin in einem separaten Prozess auszuführen. Sie können über D-Bus, Pipes usw. kommunizieren. Ein Vorteil dieses Ansatzes ist, dass einige Module weniger Berechtigungen haben können; wenn Sie ein Programm haben, das mit Hardware interagiert, die root-Berechtigungen benötigt, aber Ihre Benutzerschnittstelle könnte immer noch als nicht privilegierter Benutzer ausgeführt werden. Telepathie ist ein Beispiel für diese Art von Architektur.