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

C-Code

Listing 6 zeigt ein kleines C-Programm, das ungefähr das Gleiche macht wie das Perl-Skript vom Anfang. Um es zu kompilieren, geben Sie »cc -o helloworld helloworld.c« ein. Ausführen können Sie es einfach mit »./helloworld« . Wenn Sie es mit »strace -o strace_c.out ./helloworld« starten, sieht das Ergebnis ungefähr so aus wie Listing 7.

Listing 7

Strace von Hello in C

 

Listing 6

helloworld.c

 

Der Anfang des Logs ähnelt dem des Perl-Beispiels. Es gibt Aufrufe von »execve()« , »uname()« , »access()« für den Linker-Cache »ld.so.cache« , schließlich »mmap()« , »mprotect()« und »munmap()« . Weil das Programm selbst schon ausführbar ist und nicht etwa zur Ausführung des Skripts ein Interpreter gestartet werden muss, fehlt ein Check von User- oder Gruppen-ID. Deshalb gibt es auch keinen Readlink-Aufruf, denn man braucht keinen Interpreter, genauso wenig die ganzen Read-Aufrufe, die den Skript-Code einlesen.

Am Ende ist dann jedoch wieder ein Write-Aufruf zu sehen, der den gewünschten String "Hello World" ausgibt. Der Unterschied ist nur, dass er im Perl-Fall vom Interpreter kommt, der das Skript übersetzt hat, während in der C-Version das Programm selbst beziehungsweise die C-Bibliothek Glibc »write()« aufruft. Außerdem läuft wieder »exit_group()« ab, das im Gegensatz zu »exit()« nicht nur den Prozess beendet, sondern auch alle zugehörigen Threads.

Speichertricks

Ein ziemlich häufig auftretender Systemaufruf ist »mmap()« , der Dateien oder Geräte auf den Hauptspeicher mappt, um damit den Zugriff zu beschleunigen. Listing 7 bietet dafür einige Beispiele, so in Zeile 9. Das erste Argument ist eine Speicheradresse, die dem System mitteilt, wo das Mapping beginnen soll. Eine Null überlässt ihm die Auswahl selbst. Die folgende Zahl gibt die Größe des Speicherbereichs an. Hier entsprechen die 43270 Bytes der Größe der Stat-Struktur im davor erfolgten Fstat-Aufruf.

Die mit »PROT_« beginnenden Flags stehen für die zu vergebenden Rechte, hier nur Lese- und Ausführungsrechte. Die folgenden Flags geben die Art des Mapping an. So legt »MAP_PRIVATE« fest, dass der Speicherbereich nicht mit anderen Anwendungen geteilt werden und Änderungen im Speicher nicht in die Datei zurückfließen sollen.

Das folgende Argument ist wieder der Dateideskriptor, gefolgt vom Offset, der hier 0 ist. Nach dem Aufruf gibt Mmap die Adresse zurück, an der das Mapping startet. Munmap nimmt später diese Adresse entgegen, um den Speicher wieder aufzuräumen.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Systeme mit Vamigru verwalten

Auch wer nur kleine Flotten von Linux-Servern verwaltet, freut sich über Werkzeuge, die ihm diese Arbeit erleichtern. Vamigru tritt mit diesem Versprechen an. Wir verraten, was es leistet und wie Sie es in der eigenen Umgebung in Betrieb nehmen. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018

Microsite