PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfen ob ein shared object (.so) geladen ist



e-networld
23-06-2005, 13:51
Hallo zusammen,

ich suche eine C/C++-Funktion die mir sagt ob ein bestimmtes shared object (oder sonst eine Datei) von irgendeinem Prozeß geladen ist oder nicht. Diese Funktion sollte auch schnell antworten, das heißt das das Lesen des /proc Ordners nicht in Frage kommt, da dies zu viel Zeit in Anspruch nehmen würde.

Kennt jemand solch eine Funktion ?

MfG
Lars

Deever
23-06-2005, 15:10
ich suche eine C/C++-Funktion die mir sagt ob ein bestimmtes shared object (oder sonst eine Datei) von irgendeinem Prozeß geladen ist oder nicht. Diese Funktion sollte auch schnell antworten, das heißt das das Lesen des /proc Ordners nicht in Frage kommt, da dies zu viel Zeit in Anspruch nehmen würde.Dabei kommst du imho um Kernelprogrammierung nicht herum. Entweder du suchst alle einzelnen Dateideskriptortabellen aller Prozesse nach deiner Bibliothek/Datei ab, oder du schreibst die Kernel-open()-Funktion (sys_open bei Linux IIRC) so um, daß sie eine separate Tabelle mit den geladenen Libs erstellt, was dann aber natürlich das Laden von Programmen verlangsamt.
Wie auch immer, für was benötigst du eine solche Funktion(alität) überhaupt?


Kennt jemand solch eine Funktion ?Du plenkst (http://www.sockenseite.de/usenet/plenken.html), warum?

Gruß,
/dev

e-networld
23-06-2005, 20:15
Ich brauch das aus folgendem Grund:

Wir haben ein großes Softwarepaket welches 24h laufen muß. Nun gibt es aber Updates die eingespielt werden müssen. Es ist zwar schön das man unter Linux ohne Probleme Shared objects auf existierende, gerade benutzte kopieren kann, ohne das ein Fehler kommt (Probier das mal unter Windows :)), allerdings rauchen dann alle aktiven System die gerade geladen sind ab. Spätestens dann wenn etwas aus den neu kopieren Sachen genutzt wird und dabei ist es egal ob die Lib schon geladen war. Ziemlich uncool. Da wir das kopieren selbst in der Hand haben, bräuchten wir wie vorher beschrieben eine Funktion, mit der wir prüfen können, ob das Shared object im Zugriff ist oder nicht, um es zu kopieren oder einen Fehler auszugeben. Da das Softwarepaket in einer produktiven Umgebung läuft, kann man nicht mal ebend alle laufenden Systeme beenden, nur um ein Update einzuspielen.

peschmae
23-06-2005, 22:26
Aber wenn dir dann schon die Zugriffszeit auf /proc zu lang ist dann ist dir wohl auch die Zeit zu lang die du brauchst um so ne lib zu ersetzen? ;)

Ehrlich gesagt hab ich von so Zeugs nicht so viel Ahnung aber:
a) hast du da nicht eh redundante Systeme so dass du eben mal eines runternehmen könntest für ein paar Sekunden update?
b) du könntest natürlich ld hacken (evtl gibts sowas schon?) dass er den Übergang "sauber" hinkriegt. Dürfte aber nicht ganz einfach werden ;)
Hmm, zwar vermutlich weiss ld da gar nicht genug. Der müsste ja wissen wann Symbole nicht mehr gebraucht werden.

MfG Peschmä

panzi
23-06-2005, 23:04
Ein workaround wäre es, wenn du die .so auch selber schreibst, das die lib eine semaphor datei od. so erstellt, wenn sie läuft. am besten noch mit dem pid des prozesses drinn, dmits't schaun kanns't, ob's eh noch läuft, könnt ja abgeraucht sein und so net ordnungsgemäs die datei entfernt haben.

e-networld
24-06-2005, 10:04
Ein workaround wäre es, wenn du die .so auch selber schreibst, das die lib eine semaphor datei od. so erstellt, wenn sie läuft. am besten noch mit dem pid des prozesses drinn, dmits't schaun kanns't, ob's eh noch läuft, könnt ja abgeraucht sein und so net ordnungsgemäs die datei entfernt haben.

Die .so sind alles selber geschrieben, ich kann aber nicht für jede in einem Prozeß geladene .so eine Datei irgendwo erstellen, bei mehreren hundert Benutzern würde das schnell ausarten.

Wenn die Kopierfunktion unter Linux so wie unter Windows einfach sagen würde, dass die Datei nicht kopiert werden konnte, weil sie noch im Zugriff ist, wäre alles super :confused:

Und das Auslesen von /proc dauert schlicht zu lange bei mehreren hundert Prozessen. Zumal wenn man fertig ist, gar nicht mehr sagen kann, ob die .so wirklich noch im Zugriff ist oder nicht. Inzwischen können ja schon wieder neue System gestartet worden sein, die die so. benutzen.

anda_skoa
24-06-2005, 12:10
man fuser?

Ciao,
_

e-networld
28-06-2005, 09:36
fuser ist schon ein nettes Programm, kannte ich noch gar nicht, aber leider nur als root. Und ich bräuchte es am besten als C/C++ Funktion und auch für den normalen User.