Doku und Beispiele zu dlopen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Doku und Beispiele zu dlopen

Beitrag von Columbus » 05.11.2007 20:44:15

Hallo nochmal,
eine andere Sache beschäftigt mich auch noch. Und zwar möchte ich einen Serverprogramm schreiben, bei dem es möglich ist zur Laufzeit Funktionalität hinzu zu fügen. Sprich also Plugins, wie bei z.B. Apache.
Dazu wird die Funktion dlopen genommen. DL steht wohl für dynamisches Laden.

Leider ist im Netz irgendwie zu diesem Thema überhaupt nichts zu finden. Und auch im Standartwerk von Stevens/Rago wird nur der Name der Funktion erwähnt. Kennt jemand von Euch eine Quelle, wo beschrieben ist, wie man da am besten vorgeht?

Gruss Christian
Zuletzt geändert von Columbus am 07.11.2007 23:34:52, insgesamt 1-mal geändert.
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 05.11.2007 20:52:38

Ich würde mit

Code: Alles auswählen

man dlopen
anfangen :D

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 05.11.2007 20:54:49

Wie man das aufruft ist mir ja klar, und welche Funktionen damit im Zusammenhang stehen. Was ich suche sind wie oben geschrieben: "Beispiele"

edit: okay ich habe auch Doku geschrieben, aber ich meine damit, wie man das am besten einsetzt. Erzeuge ich dafür einen Thread, der überwacht, ob ein Modul eingelinkt wird? Wie gestalte ich so ein Modul, es ist ja auch eine Bibliothek, aber ich brauche ja sowas wie ein gemeinsames Interface. Wird das als Stub implemntiert? Einfach keinen Plan!!!????
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 06.11.2007 14:55:50

Also bei OpenGL (Mesa) wird dlopen genutzt um beim Start einer OpenGL Anwendung die passende *dri.so zu laden.
Kannst du deinen Server nicht einfach neustarten, wenn du die zusätzliche Funktionen brauchst?

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 07.11.2007 08:40:26

Wahrscheinlich nicht, aber ich möchte auch mal sehen wie so etwas funktioniert 8)

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 07.11.2007 11:35:21

Columbus hat geschrieben: Wie gestalte ich so ein Modul, es ist ja auch eine Bibliothek, aber ich brauche ja sowas wie ein gemeinsames Interface. Wird das als Stub implemntiert? Einfach keinen Plan!!!????
ja, der Name des Entrypoints sollte dem aufrufenden Programm auch bekannt sein. In C++ Programmen wird von diesem Entrypoint oft ein Pointer auf ein Objekt zurückgeliefert. Damit das aufrufende Programm damit etwas anfangen kann, muß dieses aber auch hier, über das Interface dieser Klasse Bescheid wissen.
Daher werden meistens die Entrypoints, bzw gemeinsame ( abstrakte) Basisclassen (Interfaces) in Headerdateien deklariert, die sowohl vom aufrufenden Programm, als auch vom Modul includiert werden.

Gruß
gms

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 07.11.2007 12:19:36

hi,

ein Beispiel aus dem wirklichen Leben: weil mir der Apache viel zu
kompliziert ist, hab' ich mir den bozohttpd aufgemotzt. Das Ergebnis
ist ein httpd, der ein CGI-Script als Plugin nachladen kann, ohne
neu zu starten.

Ein Plugin ist jeweils eine C-Funktion, aus der mit "gcc -fpic -shared"
ein shared object gemacht wird. Diese liegen alle in einem Verzeichnis.
Wenn der httpd ein SIGUSR1 bekommt, liest er das Verzeichnis und
lädt Plugins, die sich geändert haben mit dlopen(). Gleichzeitig wird
eine Liste aufgebaut

Code: Alles auswählen

typedef int cgi_fp (const char *);

typedef struct cgi_st {
  const char    *script;
  void          *dlhandle;
  union {
    cgi_fp   *f;
    void     *v;
  }              function;
  time_t         mtime;      // mtime von plugin.so
  int            status;     // Listenelement ist gültig/gelöscht/...
  char          *dlerr;      // strdup (dlerror ())
  struct cgi_st *next;
} cgi_st;
dlhandle ist das Ergebnis von dlopen(), die union enthält den Zeiger auf
die Funktion und ist nur dazu da, damit der gcc nicht meckert (Geht das
nicht eleganter?). script ist der Dateiname, aber "zufällig" auch der Name
der Funktion und des CGI-Scripts. Ein http-Request "/cgi-bin/foo?bar" führt
so zum Aufruf foo ("bar");

Dieses Beispiel ist natürlich besonders einfach, weil die Schnittstelle für
neue Plugins immer der http-Request ist. Wenn es mehrere verschiedene
Schnittstellen gibt, könnte man evt. mehrere "typedef cgi_fp()" benutzen,
die union ist ja eh' schon drin.

Das SIGUSER zum Nachladen kann man wohl auch durch inotify ersetzen,
dann geht's wirklich dynamisch.

Hoffentlich war das jetzt nicht völlig unverständlich.
Beware of programmers who carry screwdrivers.

Antworten