Wolf / Krooß | Systemnahe Programmierung mit C und Linux | E-Book | sack.de
E-Book

E-Book, Deutsch, 1386 Seiten

Reihe: Rheinwerk Computing

Wolf / Krooß Systemnahe Programmierung mit C und Linux

Das umfassende Handbuch
5. Auflage 2024
ISBN: 978-3-8362-9750-9
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection

Das umfassende Handbuch

E-Book, Deutsch, 1386 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-8362-9750-9
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection



Alles zur systemnahen Anwendungsprogrammierung: von den E/A-Funktionen, dem Zugriff auf Systeminformationen über Prozesse, Signale, Interprozesskommunikation und Threads bis hin zu Netzwerkprogrammierung, Datenbanken und GUIs. Für alle, die Programme schreiben wollen und alte Software warten oder portieren müssen. Alle Beispiele sind auch auf dem Raspberry Pi ausführbar. Solide C- und Linux-Kenntnisse werden vorausgesetzt.

Aus dem Inhalt:

  • E/A-Funktionen
  • Attribute von Dateien und Verzeichnissen
  • Zugriff auf Systeminformationen
  • Devices - eine einfache Verbindung zur Hardware
  • System- und Benutzerdateien
  • Dämonen, Zombies und Prozesse
  • Signale
  • IPC - Interprozesskommunikation
  • Threads
  • Netzwerkprogrammierung
  • Datenbanken (MySQL, PostgreSQL)
  • GUIs mit GTK+
  • Werkzeuge für Programmierer


Jürgen Wolf ist seit über 16 Jahren Autor und seit mehr als 10 Jahren passionierter Digitalfotograf. Seine Buchthemen sind Bildbearbeitung, Fotografie, Webentwicklung, Betriebssysteme und Programmierung. Und egal welches Thema: Bei jedem Buch ist es sein Ziel, auch komplexe Zusammenhänge klar und verständlich zu erklären.
Wolf / Krooß Systemnahe Programmierung mit C und Linux jetzt bestellen!

Weitere Infos & Material


Materialien zum Buch ... 23  1.  Einführung ... 25  1.1 ... Anforderungen an den Leser ... 25  1.2 ... Anforderungen an das Betriebssystem ... 26  1.3 ... UNIX, der Vorgänger von Linux ... 27  1.4 ... Die Entwicklung von Linux ... 29  1.5 ... Der Compiler GCC -- eine kurze Einführung ... 31  1.6 ... POSIX, X/OPEN und ANSI C ... 37  1.7 ... Übersicht zu diesem Buch ... 40  1.8 ... Schreibkonventionen ... 42  1.9 ... Weitere Hilfen ... 43  2.  E/A-Funktionen ... 45  2.1 ... Elementare E/A-Funktionen ... 45  2.2 ... Filedeskriptoren ... 47  2.3 ... Funktionen, die einen Filedeskriptor verwenden ... 50  2.4 ... Standard-E/A-Funktionen ... 99  2.5 ... Die Arbeit mit Verzeichnissen ... 113  2.6 ... Fehlerbehandlung ... 134  2.7 ... Ausblick ... 137  3.  Attribute von Dateien und Verzeichnissen abfragen und ändern ... 139  3.1 ... Die Struktur stat ... 139  4.  Zugriff auf Systeminformationen ... 157  4.1 ... Informationen aus dem /proc-Verzeichnis herausziehen ... 157  4.2 ... Hardware-/Systeminformationen ermitteln ... 160  4.3 ... Prozessinformationen auslesen ... 166  4.4 ... Kernel-Informationen in /proc ... 171  4.5 ... Verschiedene Dateisysteme unter Linux verwalten ... 180  4.6 ... Weiterführendes ... 181  5.  Devices -- eine einfache Verbindung zur Hardware ... 183  5.1 ... Die Gerätedateitypen ... 183  5.2 ... Die Gerätedateinummern ... 185  5.3 ... Zugriff auf die Gerätedateien ... 186  5.4 ... Gerätenamen ... 188  5.5 ... Spezielle Gerätedateien ... 190  5.6 ... Gerätedateien in der Praxis einsetzen ... 191  6.  System- und Benutzerdateien ... 227  6.1 ... Die Datei /etc/passwd ... 227  6.2 ... Die Datei /etc/shadow ... 234  6.3 ... Die Datei /etc/group ... 239  6.4 ... uname -- Informationen zum lokalen System erfragen ... 243  6.5 ... Das Verzeichnis /etc/skel und Network Information Service (NIS) ... 245  6.6 ... Dateien für Netzwerkinformationen ... 246  7.  Prozesse, Dämonen und Zombies ... 247  7.1 ... Was ist ein Prozess? ... 247  7.2 ... Prozesskomponente ... 248  7.3 ... Prozesse überwachen mit ps, top und kpm ... 258  7.4 ... Der Lebenszyklus eines Prozesses ... 261  7.5 ... Umgebungsvariablen eines Prozesses ... 263  7.6 ... Ressourcenlimits eines Prozesses ... 271  7.7 ... Prozesserkennung ... 275  7.8 ... Erzeugung von neuen Prozessen mit fork() ... 277  7.9 ... Warten auf einen anderen Prozess ... 288  7.10 ... Die exec-Familie ... 296  7.11 ... Kommandoaufrufe aus dem Programm -- system() ... 302  7.12 ... Dämonprozesse ... 304  7.13 ... Mehr über die Ausführung von Prozessen ... 315  7.14 ... Zusammenfassung und Ausblick ... 330  8.  Signale ... 331  8.1 ... Grundlagen zu den Signalen ... 331  8.2 ... Das neue Signalkonzept ab Kernel 2.6.18 ... 338  8.3 ... Die Signalmenge initialisieren ... 339  8.4 ... Elemente zu der Signalmenge hinzufügen oder aus ihr entfernen ... 339  8.5 ... Signale einrichten und abfragen ... 340  8.6 ... Signale an andere Prozesse senden mit kill() ... 347  8.7 ... Eine Zeitschaltuhr einrichten mit alarm() ... 348  8.8 ... Prozesse stoppen, bis ein Signal eintritt, mit pause() ... 349  8.9 ... Prozesse für eine bestimmte Zeit stoppen mit sleep() und usleep() ... 349  8.10 ... Die Signalmaske erfragen oder ändern mit sigprocmask() ... 350  8.11 ... Einen Prozess während einer Änderung der Signalmaske stoppen mit sigsuspend() ... 351  8.12 ... Prozesse synchronisieren ... 351  9.  IPC -- Interprozesskommunikation ... 355  9.1 ... Unterschiedliche Interprozesskommunikations-Techniken im Überblick ... 356  9.2 ... Gründe für IPC ... 364  9.3 ... Pipes ... 365  9.4 ... System-V-Interprozesskommunikation ... 408  9.5 ... Semaphore ... 410  9.6 ... Message Queues ... 419  9.7 ... Shared Memory ... 432

10.  Threads ... 443  10.1 ... Unterschiede zwischen Threads und Prozessen ... 443  10.2 ... Thread-Bibliotheken ... 444  10.3 ... Kernel- und User-Threads ... 445  10.4 ... Scheduling und Zustände von Threads ... 445  10.5 ... Die grundlegenden Funktionen der Thread-Programmierung ... 447  10.6 ... Die Attribute von Threads und das Scheduling ... 459  10.7 ... Threads synchronisieren ... 465  10.8 ... Threads abbrechen (canceln) ... 493  10.9 ... Erzeugen von threadspezifischen Daten (TSD) ... 498  10.10 ... Mit pthread_once() einen Codeabschnitt auf einmal ausführen ... 501  10.11 ... Thread-safe-Funktionen (thread-sichere Funktionen) ... 504  10.12 ... Threads und Signale ... 505  10.13 ... Zusammenfassung und Ausblick ... 510

11.  Netzwerkprogrammierung ... 513  11.1 ... Einführung ... 513  11.2 ... Aufbau von Netzwerken ... 514  11.3 ... TCP/IP -- Aufbau und Struktur ... 520  11.4 ... TCP-Socket ... 524  11.5 ... Das Kommunikationsmodell der Sockets ... 525  11.6 ... Grundlegende Funktionen zum Zugriff auf die Socket-Schnittstelle ... 525  11.7 ... Aufbau eines Clientprogramms ... 535  11.8 ... Aufbau des Serverprogramms ... 540  11.9 ... IP-Adressen konvertieren, manipulieren und extrahieren ... 545  11.10 ... Namen und IP-Adressen ineinander umwandeln ... 552  11.11 ... Pufferung bei Netzwerk-Sockets ... 562  11.12 ... Standard-E/A-Funktionen verwenden ... 563  11.13 ... Parallele Server ... 565  11.14 ... Synchrones Multiplexing mit select() ... 582  11.15 ... POSIX-Threads und Netzwerkprogrammierung ... 604  11.16 ... Optionen für Sockets setzen und abfragen ... 610  11.17 ... Das UDP-Protokoll (User Datagram Protocol) ... 615  11.18 ... Unix Domain Sockets ... 624  11.19 ... Multicast-Socket ... 630  11.20 ... Nicht blockierende I/O-Sockets ... 639  11.21 ... Streams, TLI, Raw Socket und XTI ... 642  11.22 ... IPv4 und IPv6 ... 644  11.23 ... Netzwerksoftware nach IPv6 portieren ... 646  11.24 ... Sicherheit und Verschlüsselung ... 647

12.  MySQL und PostgreSQL ... 649  12.1 ... Relationale Datenbanksysteme ... 649  12.2 ... Der relationale Datenbankserver ... 653  12.3 ... SQL-Server im Überblick ... 653  12.4 ... Die MySQL-Datenbank ... 654  12.5 ... Die MySQL-C-API ... 684  12.6 ... Beispiel: Ein einfaches Newssystem ... 728  12.7 ... Neue SQL-Funktionen für die Shell -- MySQL erweitern ... 759  12.8 ... MySQL-Funktionen mit der UDF-Schnittstelle entwerfen ... 760  12.9 ... PostgreSQL: Ein objektrelationales Datenbankverwaltungssystem ... 771

13.  Terminal-E/A und Benutzerschnittstellen für die Konsole ... 813  13.1 ... termios ... 813  13.2 ... Terminalinformationen in terminfo ... 837  13.3 ... Halbgrafik erstellen mit ncurses ... 847

14.  GTK+ ... 891  14.1 ... Was ist GTK+? ... 891  14.2 ... GTK+-Anwendungen übersetzen ... 896  14.3 ... Eine Einführung in die GLib-Bibliothek ... 897  14.4 ... Grundlagen der GTK+-Programmierung ... 923  14.5 ... Fenster anlegen mit GtkWindow ... 935  14.6 ... Anzeigeelemente ... 944  14.7 ... Behälter für Widgets ... 953  14.8 ... Buttons und Toggled-Buttons ... 967  14.9 ... Dateneingaben auswerten ... 977  14.10 ... Menüs und Toolbars erstellen ... 989  14.11 ... Mehrzeiligen Text erstellen ... 1009  14.12 ... Auswählen von Widgets (Selection) ... 1023  14.13 ... Events auswerten ... 1033  14.14 ... Weitere Widget- und GTK+-Elemente im Überblick ... 1039

15.  Übersicht über weitere beliebte GUI-Bibliotheken ... 1043  15.1 ... gtkmm -- GTK+ für C++ ... 1043  15.2 ... wxWidgets ... 1047  15.3 ... FLTK ... 1051  15.4 ... Qt ... 1053  15.5 ... Die niedrige Ebene: X-Window-Programmierung ... 1056  15.6 ... Multimediabibliotheken ... 1057

16.  Werkzeuge für Programmierer ... 1065  16.1 ... Der Compiler GCC ... 1065  16.2 ... make ... 1074  16.3 ... Eigene Bibliotheken erstellen ... 1091  16.4 ... RPM-Pakete ... 1101  16.5 ... RCS und CVS ... 1114  16.6 ... Laufzeitmessung von Programmen ... 1143  16.7 ... Debuggen mit GDB und DDD ... 1151  16.8 ... STRACE -- Systemaufrufe verfolgen ... 1164  16.9 ... Memory Leaks und unerlaubte Speicherzugriffe ... 1167  16.10 ... Ausblick ... 1175  Anhang ... 1177  A ... Sicherheit unter Linux ... 1179  B ... Funktionsreferenz ... 1201  C ... Linux/UNIX-Kommandoreferenz ... 1283  Index ... 1365


1.5    Der Compiler GCC – eine kurze Einführung


Da in diesem Buch Vorkenntnisse in C erforderlich sind, wissen Sie wahrscheinlich schon, womit ein Programm geschrieben, übersetzt und ausgeführt wird. Welchen Editor oder gar welche Entwicklungsumgebung Sie dazu verwenden, bleibt letztendlich Ihnen selbst überlassen. Der eine wird seine Programme vielleicht gerne mit vi oder dem Emacs schreiben, und der andere verwendet vielleicht lieber gleich eine Entwicklungsumgebung wie KDevelop oder Anjuta – dies ist wohl eher Sache des guten Geschmacks. Umsteiger von Windows werden beim Anblick und der Verwendung von vi vielleicht denken, ihre Tastatur sei kaputt, weil sie nicht so reagiert wie bei dem guten alten Edit-Werkzeug, das bei Windows stets mit dabei ist. Echte UNIX-Puristen werden sich dagegen von der überfüllten Entwicklungsumgebung schnell wieder verabschieden.

Lassen Sie sich aber bitte nicht einreden, dass dieses oder jenes Tool oder Editor das Nonplusultra sei. Gehen Sie solchen Puristen am besten gleich aus dem Weg, und verwenden Sie die Programme, die Ihnen am besten zusagen – in 80 Prozent der Fälle tut es nämlich der Editor nano oder der wirklich sehr zu empfehlende Editor SciTE, der allerdings wegen der Menüsteuerung einen Desktop voraussetzt. Ob Ihr Editor und Ihre Kommandozeile dann in einem separaten Fenster laufen oder nicht, ist fast immer zweitrangig. Zum Übersetzen der Programme in diesem Buch reicht jedenfalls die Kommandozeile aus. Daher werden wir gerade für Umsteiger oder Einsteiger hier in einer kurzen Einführung die wichtigsten Optionen des GNU C Compilers (GCC) beschreiben. Für mehr Informationen sollten Sie dann auch die Manual Page von GCC lesen. Dies können Sie mit dem folgenden Kommando in der Kommandozeile erledigen:

man gcc

Hinweis


GCC ist hier übrigens die Abkürzung von »GNU C Compiler Collection«, GCC wird aber meist mit dem Compiler GCC gleichgesetzt. Im Endeffekt ist dies nicht ganz richtig, weil ja zu dem Compiler selbst noch eine Sammlung (engl. collection) nützlicher Bibliotheken gehört. Aber viele Benutzer sind nicht so spitzfindig und setzen GCC mit dem Compiler gleich.

1.5.1    Den GCC von der Kommandozeile aus aufrufen


Generell gibt es vier Aufrufmöglichkeiten des GCC von der Kommandozeile aus, wobei nicht alle Varianten bei Ihnen installiert sein müssen. Gewöhnlich wird für den Aufruf des GCC das Kommando gcc verwendet, aber es sind eventuell auch noch folgende Varianten vorhanden:

  • cc

  • g++

  • c++

In Wahrheit ist der GCC nämlich nur ein sogenanntes Frontend. Ein Frontend ist ein Programm, das andere Programme aufruft, je nachdem, welche Parameter Sie über die Kommandozeile übergeben. Beim GCC sind dies: Der Präprozessor cpp, der Compiler cc1 oder cc1plus, der Assembler as und der Linker collect2 inklusive ld. GCC bestimmt in der Regel anhand der Dateiendung selbst, welchen Compiler er anzuwenden hat. Daher lässt sich GCC sowohl für C und C++ als auch für Assembler-Dateien anwenden. Das ist sogar manchmal sinnvoller, als nur den Assembler as oder den Linker ld aufzurufen, denn das GCC-Frontend übergibt noch weitere Flags, die in der Regel dazu führen, dass man keine Fehlermeldung(en) beim Ausführen bekommt. Ein Flag ist hierbei eine Art Schalter, der eine bestimmte Funktion ein- oder ausschaltet. So kann z. B. durch das Flag -lm die Mathematikbibliothek eingebunden werden, die beispielsweise Fließkommaprozessoren unterstützt.

Die Frontends g++/c++ weisen den Linker ld zusätzlich an, die STL usw. mit einzubinden, was beim GCC trotz der Dateiendung nicht passiert und daher immer wieder bei Anfängern unter Linux zur Verwirrung führt. Meistens sind cc und c++ bzw. posix_cc und posix_c++ aber nur Aliasse für gcc und g++, aber das muss nicht immer der Fall sein. Am besten ist es deshalb, wenn Sie eine C++-Datei mit dem C++-Kommando kompilieren, denn damit können Sie eigentlich nichts falsch machen.

1.5.2    Wichtige Kommandozeilen-Parameter für den GCC


Wenn Sie den GCC aufrufen, erwartet er erst einmal Befehle (sogenannte Parameter), die angeben, was er mit dem Quellcode tun soll. gcc kennt unzählige Optionen. Die wichtigsten finden Sie in Tabelle 1.1 zusammengefasst.

Option

Bedeutung

-o

(output) Wollen Sie, dass der Compiler die ausführbare Datei anders benennt als a.out, dann sollten Sie mit dieser Option den Namen der Ausgabedatei angeben.

-c

(compile) Kompilieren, ohne zu linken

-Dname=value

(define) Definiert ein Präprozessor-Makro mit dem Namen name und dem Wert value in der Kommandozeile.

-Idirname

(include directory) Fügt dirname zur Liste der Include-Dateien hinzu, in denen danach gesucht werden soll.

-Ldirname

(library) Fügt dirname zur Liste der Verzeichnisse hinzu, in denen nach Bibliotheksdateien gesucht werden soll (-L gilt für .so und .a).

-static

Es werden nur statische Bibliotheken zum Linken verwendet.

-lname

(library) Gibt die Bibliothek an, die hinzugelinkt werden soll. Hier die Bibliothek name (wird eine .so-Datei gefunden, wird sie benutzt, andernfalls .a, sollte diese existieren).

-O

(optimize) den kompilierten Quellcode optimieren

-On

(optimize) Wie das Flag -O, nur kann mit n die Optimierungsstufe angegeben werden. Mindestens ist 1 und maximal 3 möglich. Mit der Angabe von 0 wird die Optimierung ausgeschaltet. Es sind auch Levels oberhalb 3 möglich, die haben aber keinen Effekt.

-g

(debug) Fügt Standard-Debug-Informationen zum Debuggen hinzu.

-ggdb

(debug gdb) Fügt Debug-Informationen hinzu, die nur der Debugger gdb versteht (auch hier gibt es wieder verschiedene Stufen; wer in der Welt der vielen -g-Möglichkeiten einfach nur »alles« will, gibt am besten -ggdb3 an; da hat man alles (laut Manpage).

...


Wolf, Jürgen
Jürgen Wolf ist seit über 16 Jahren Autor und seit mehr als 10 Jahren passionierter Digitalfotograf. Seine Buchthemen sind Bildbearbeitung, Fotografie, Webentwicklung, Betriebssysteme und Programmierung. Und egal welches Thema: Bei jedem Buch ist es sein Ziel, auch komplexe Zusammenhänge klar und verständlich zu erklären.

Krooß, René
René Krooß ist Diplom-Informatiker, begeisterter Programmierer und Experte für Prozessorstrukturen, Betriebssysteme, Hardware-Programmierung und Algorithmen. Sein Hobby: die Videobearbeitung mit professioneller Software wie Magix Video Deluxe. Sein Ziel: Einsteigern und Fortgeschrittenen einen einfachen Zugang zu C zu ermöglichen.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.