Immer größere Datenmassen sicher zu speichern ist eine Herausforderung für jede IT-Infrastruktur. Schon mit Gigabit-Ethernet lassen sich aber ... (mehr)

Bibliotheksrecherche

Die Aufrufe von »getuid()« und »getgid()« bringen die User und die Group-ID des Benutzers in Erfahrung, der das Programm gestartet hat. Dagegen liefern »geteuid()« und »geteguid()« die effektiven User- und Group-IDs zurück, unter denen das Programm tatsächlich läuft, zum Beispiel wenn der Benutzer »sudo« verwendet hat. Es folgt wieder eine Reihe von Open- und Stat-Aufrufen für Systemverzeichnisse und Perl-Bibliotheken, von denen jedoch die meisten -1 zurückgeben, weil – wie gesagt – eine ganze Reihe von Verzeichnissen und Dateien durchsucht wird.

Irgendwann wird schließlich der Perl-Interpreter aufgerufen. Zeile 10 in Listing 2 sucht den Pfad zur ausführbaren Perl-Datei, indem sie die Pseudo-Datei des Proc-Dateisystems »/proc/self/exe« und als zweites Argument einen Pointer auf den Puffer für das Ergebnis übergibt. Im Strace-Log ist schon das Ergebnis »/usr/bin/perl« zu sehen. Der Rückgabewert ist die Länge des geschriebenen Puffers, also hier jene 13 Bytes, die der String »/usr/bin/perl« einnimmt.

Der Aufruf von »getppid()« liefert umstandslos die ID des laufenden Prozesses. Die folgende Read-Operation auf dem File Handle 3 liest schließlich den Quelltext des Perl-Skripts, wie man in den Klammern sehen kann (Zeile 12). Auch hier ist das zweite Argument des Open-Aufrufs ein Pointer auf einen Buffer, in dem die C-Library das Ergebnis ablegt.

Lesen und schreiben über File Handles

Listing 3 zeigt die Zeilen der Strace-Ausgabe, die sich um die Strict-Anweisung im Perl-Code kümmern. Eine Reihe von Suchversuchen schlägt fehl, bis schließlich mit dem Stat-Aufruf in Zeile 4 das passende Perl-Modul »/usr/share/perl/5.8/strict.pm« gefunden ist. Listing 4 zeigt das Öffnen und anschließende Lesen aus dieser Datei. Hier ist gut zu erkennen, wie die Lese- und Seek-Operationen den Wert 4 als File Handle verwenden, den der Open-Aufruf in Zeile 1 zurückgegeben hat.

Listing 4

Perl-Modul lesen

 

Listing 3

Perl-Modul gesucht

 

Wenn das Einlesen der Skriptdatei und der nötigen Bibliotheken abgeschlossen ist, startet der Perl-Interpreter seine Arbeit. Die schlägt sich allerdings nicht im Strace-Log nieder, denn das protokolliert eben nur Systemaufrufe, also Sprünge vom Userspace in den Kernel, und die sind beim Übersetzen des Perl-Skripts in Maschinencode nicht nötig.

Das Ergebnis dieses Ablaufs zeigt sich erst in Zeile 4 von Listing 5 . In Zeile 2 ist noch das abschließende Lesen des Skripts zu sehen, das dazu führt, dass die Datei in Zeile 3 geschlossen wird. Zeile 4 gibt schließlich mit Systemmitteln, das heißt einem Systemaufruf von »write()« , den String "Hello, Perl!\n" aus.

Listing 5

Ende des Perl-Trace

 

Das war ziemlich viel Aufwand für eine so einfache Sache, aber immerhin haben Sie nun einen kleinen Einblick davon bekommen, was hinter den Kulissen so alles abläuft. Gleich sehen Sie, was passiert, wenn man statt eines Perl-Skripts ein in C geschriebenes Programm mit Strace analysiert.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023