Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Prüfen ob ein shared object (.so) geladen ist

  1. #1
    e-networld
    Gast

    Prüfen ob ein shared object (.so) geladen ist

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    29.02.2004
    Beiträge
    113
    Zitat Zitat von e-networld
    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, warum?

    Gruß,
    /dev

  3. #3
    e-networld
    Gast
    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.

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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
    [Edit]Hmm, zwar vermutlich weiss ld da gar nicht genug. Der müsste ja wissen wann Symbole nicht mehr gebraucht werden.[/edit]

    MfG Peschmä
    Geändert von peschmae (23-06-2005 um 22:39 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    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.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #6
    e-networld
    Gast
    Zitat Zitat von panzi
    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

    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.

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    man fuser?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    e-networld
    Gast
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •