Systemnahe Programmierung mit C und Linux
Autori
Viac o knihe
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 Inhaltsverzeichnis 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