Rezension: Practical System Programming with C
Sri Manikanta Palakollu: Practical System Programming with C: Pragmatic Example Applications in Linux and Unix-Based Operating Systems; Apress, New York, 2021
ISBN: 978-1-4842-6320-4 (Paperback)
Dieses englischsprachige Buch ist für Programmierer, die bereits mit C gearbeitet haben und etwas über Systemprogrammierung lernen wollen. Es enthält Beispielcode, der über die Buchseite bei Apress bei GitHub gefunden werden kann.
Das Buch hat ein ausführliches Inhaltsverzeichnis sowie einen Index und eignet sich damit formal als Nachschlagewerk, um Details wieder ins Gedächtnis zu rufen.
Kapitel 1 bietet eine Einführung in die Linux Umgebung. Kommandozeilenaffine Leser können dieses Kapitel getrost überspringen und sich den anderen Kapiteln widmen. Für Leser, die Computer vorwiegend über grafische oder Touchoberflächen kennengelernt haben, kann dieses Kapitel vielleicht die Abneigung vor der Kommandozeile reduzieren. Die Auswahl der vorgestellten Programme scheint mir nicht ganz schlüssig, ich habe den roten Faden nicht gefunden.
In Kapitel 2 geht es um Multithreading mit C. Es beginnt mit einer Einführung in Threads, geht auf die Unterschiede zwischen Threads und Prozessen, Concurrency und Parallelism ein sowie auf den Support für Threads in C mit POSIX Threads. Beispielprogramme runden das Kapitel ab und helfen beim Verständnis der mitunter knappen Erläuterungen.
Kapitel 3 gibt einen Überblick über die POSIX Standards und System-Level-APIs. Leider ist dieser Überblick nur sehr grob, die Liste einiger Standard-Header-Dateien und der damit verbundenen Funktionalität ist eher enttäuschend. Hier macht sich das Fehlen von Referenzen und weiterführenden Literaturverweisen besonders bemerkbar.
Die in Kapitel 4 folgende Einführung in Dateisysteme, Metadaten und Inodes ist wieder ausführlicher, der Beispielcode hilft, den Text anschaulicher zu machen.
In Kapitel 5 geht es um Prozesse und Signale. Der Umgang mit Umgebungsvariablen wird erläutert sowie die Erzeugung/Beendigung von Prozessen und die Behandlung von Signalen.
Kapitel 6 behandelt Interprozess Communication (IPC). Es geht auf Pipes, FIFOs, Message Queues, Semaphore, Shared Memory und Sockets ein. Hier wechselt der Font für den Beispielcode. Da dieser über GitHub verfügbar ist, wird man ihn wohl sowieso eher in der Entwicklungsumgebung am Rechner betrachten.
Kapitel 7 vertieft den Umgang mit Shared Memory, der im vorigen Kapitel nur mit zwei kurzen Absätzen erwähnt wurde.
In Kapitel 8 geht es schließlich ausführlicher um die Programmierung von Netzwerk-Sockets. Das Kapitel beginnt mit einer ausführlichen Beschreibung des OSI-sowie des TCP/IP-Architekturmodells. Anschließend wird die Client-Server-Architektur vorgestellt und diskutiert. Hier hätte ich mir einen Vergleich mit anderen Architekturen, zum Beispiel Peer-to-Peer gewünscht. Einige Systemaufrufe für die Socket-Programmierung werden vorgestellt, dann folgt die Implementation einer Client-Server-Architektur mit Beispielprogrammen.
Unmittelbar danach folgt der Index.
Fazit
Das Niveau Intermediate trifft ziemlich genau für das Buch zu. Es ist gut strukturiert und prinzipiell als Nachschlagewerk geeignet. Allerdings sind die Erläuterungen mitunter sehr knapp und nicht immer verständlich, die Handbuchseiten zu den Funktionen und Systemaufrufen sind meist ausführlicher. Demgegenüber lässt sich der Beispielcode verwenden, um das im Text geschriebene nachzuvollziehen und darauf aufbauend eigene Ideen weiter zu entwickeln.
Was ich schmerzlich vermisst habe sind ein Literaturverzeichnis und Referenzen zum Vertiefen der angesprochenen Themen. Hier haben die Bücher von W. Richard Stevens auch nach über 20 Jahren nichts von ihrem Wert eingebüßt.
Posted 2021-03-02