Linux-Unix-Programmierung - Das umfassende Handbuch
von: Jürgen Wolf
Galileo Press, 2005
ISBN: 9783898425704
Sprache: Deutsch
1141 Seiten, Download: 6815 KB
Format: PDF, auch als Online-Lesen
Auf einen Blick | 3 | ||
Inhalt | 5 | ||
Vorwort der Gutachter | 23 | ||
Vorwort | 25 | ||
Danksagung | 25 | ||
1 Einführung | 29 | ||
1.1 Anforderung an den Leser | 29 | ||
1.2 Anforderung an das Betriebssystem | 30 | ||
1.3 Von Unix – | 30 | ||
1.4 – zu Linux | 31 | ||
1.5 Der Compiler GCC – Ein kurze Einführung | 32 | ||
1.5.1 GCC erhöre uns – der Aufruf | 33 | ||
1.5.2 Was befiehlst du – Meister | 33 | ||
1.5.3 Klassifikation der Dateitypen | 37 | ||
1.6 POSIX, X/OPEN und ANSI C | 37 | ||
1.7 Übersicht zum Buch | 38 | ||
1.8 Schreibkonventionen | 40 | ||
1.9 Notationsstil | 41 | ||
1.10 Weitere Hilfen | 41 | ||
2 E/A-Funktionen | 43 | ||
2.1 Elementare E/A-Funktionen | 43 | ||
2.2 Filedeskriptor | 44 | ||
2.2.1 Verwaltung für offene Deskriptoren | 45 | ||
2.3 Funktionen, die den Filedeskriptor verwenden | 46 | ||
2.3.1 Datei öffnen – open() | 46 | ||
2.3.2 Anlegen einer neuen Datei – creat() | 51 | ||
2.3.3 Datei schließen – close() | 52 | ||
2.3.4 Schreiben von Dateien – write() | 52 | ||
2.3.5 Lesen von Dateien – read() | 55 | ||
2.3.6 Schreib-/Lesezeiger positionieren – lseek() | 57 | ||
2.3.7 Duplizieren von Filedeskriptoren – dup() und dup2() | 60 | ||
2.3.8 Ändern oder Abfragen der Eigenschaften eines Filedeskriptors – fcntl() | 62 | ||
2.3.9 Record Locking – Sperren von Dateien einrichten | 67 | ||
2.3.10 Multiplexing E/A – select() | 76 | ||
2.3.11 Unterschiedliche Operationen – ioctl() | 79 | ||
2.3.12 Lesen und Schreiben mehrerer Puffer – writev() und readv() | 80 | ||
2.3.13 Übersicht zu weiteren Funktionen, die den Filedeskriptor verwenden | 82 | ||
2.4 Standard-E/A-Funktionen | 85 | ||
2.4.1 Der FILE-Zeiger | 85 | ||
2.4.2 Öffnen und Schließen von Dateien | 86 | ||
2.4.3 Formatierte Ausgabe | 88 | ||
2.4.4 Formatierte Eingabe | 89 | ||
2.4.5 Binäres Lesen und Schreiben | 90 | ||
2.4.6 Zeichen- und zeilenweise Ein-/Ausgabe | 90 | ||
2.4.7 Status der Ein-/Ausgabe überprüfen | 91 | ||
2.4.8 Stream postionieren | 92 | ||
2.4.9 Puffer kontrollieren | 93 | ||
2.4.10 Datei löschen und umbenennen | 95 | ||
2.4.11 Temporäre Dateien erstellen | 95 | ||
2.5 Mit Verzeichnissen arbeiten | 96 | ||
2.5.1 Ein neues Verzeichnis anlegen – mkdir() | 96 | ||
2.5.2 In ein Verzeichnis wechseln – chdir(), fchdir() | 98 | ||
2.5.3 Ein leeres Verzeichnis löschen – rmdir() | 99 | ||
2.5.4 Format eines Datei-Eintrags in struct dirent | 100 | ||
2.5.5 Einen Verzeichnis-Stream öffnen – opendir() | 101 | ||
2.5.6 Lesen aus dem DIR-Stream – opendir(), und Schließen des DIR- Streams – closedir() | 103 | ||
2.5.7 Positionieren des DIR-Streams | 106 | ||
2.5.8 Komplettes Verzeichnis einlesen – scandir() | 106 | ||
2.5.9 Ganze Verzeichnisbäume durchlaufen – ftw() | 111 | ||
2.6 Fehlerbehandlung | 114 | ||
2.7 Ausblick | 117 | ||
3 Attribute von Dateien und Verzeichnissen | 119 | ||
3.1 Struktur stat | 119 | ||
3.1.1 Dateiart und Zugriffsrechte einer Datei erfragen – st_mode | 120 | ||
3.1.2 User-ID-Bit und Group-ID-Bit – st_uid und st_gid | 123 | ||
3.1.3 Inode ermitteln – st_ino | 124 | ||
3.1.4 Linkzähler – st_nlink | 124 | ||
3.1.5 Größe der Datei – st_size | 128 | ||
3.1.6 st_atime, st_mtime, st_ctime | 130 | ||
4 Zugriff auf Systeminformationen | 133 | ||
4.1 Informationen aus dem /proc- Verzeichnis herausziehen | 134 | ||
4.2 Hardware-/Systeminformationen ermitteln | 135 | ||
4.2.1 CPU-Informationen – /proc/cpuinfo | 136 | ||
4.2.2 Geräteinformationen – /proc/devices | 137 | ||
4.2.3 PCI-Bus – /proc/pci (nicht 2.6) | 137 | ||
4.2.4 Speicherauslastung – /proc/meminfo | 137 | ||
4.2.5 Weitere Hardwareinformationen zusammengefasst | 137 | ||
4.3 Prozessinformationen | 141 | ||
4.3.1 /proc/$pid/cmdline | 142 | ||
4.3.2 /proc/$pid/environ | 142 | ||
4.3.3 /proc/self | 143 | ||
4.3.4 /proc/$pid/fd/ | 143 | ||
4.3.5 /proc/$pid/statm | 144 | ||
4.4 Kernelinformationen | 145 | ||
4.4.1 /proc/locks | 150 | ||
4.4.2 /proc/modules | 151 | ||
4.5 Filesysteme | 152 | ||
4.5.1 /proc/mounts | 152 | ||
4.6 Weiterführendes | 152 | ||
5 Devices – Eine einfache Verbindung zur Hardware | 155 | ||
5.1 Die Gerätedatei- Typen | 155 | ||
5.2 Die Gerätedatei-Nummern | 156 | ||
5.3 Zugriff auf die Gerätedateien | 157 | ||
5.4 Gerätenamen | 157 | ||
5.5 Spezielle Gerätedateien | 159 | ||
5.6 Gerätedateien in der Praxis einsetzen | 160 | ||
5.6.1 CD auswerfen und wieder schließen | 162 | ||
5.6.2 CD-ROM-Fähigkeiten | 163 | ||
5.6.3 Audio CD abspielen – komplett und einzelne Tracks – Pause, Fortfahren und Stopp | 164 | ||
5.6.4 Aktuellen Status der Audio CD ermitteln | 168 | ||
5.6.5 Das komplette Listing | 170 | ||
6 Dämonen, Zombies und Prozesse | 177 | ||
6.1 Was ist ein Prozess? | 177 | ||
6.2 Prozesskomponente | 177 | ||
6.2.1 Prozessnumer (PID) | 178 | ||
6.2.2 Prozessnummer des Vaterprozesses (PPID) | 179 | ||
6.2.3 Benutzer- und Gruppennummer eines Prozesses (UID, EUID, GID, EGID) | 179 | ||
6.2.4 Prozessstatus | 180 | ||
6.2.5 Prozesspriorität | 181 | ||
6.2.6 Time-Sharing-Prozesse | 181 | ||
6.2.7 Prozessauslagerung | 185 | ||
6.2.8 Steuerterminal | 186 | ||
6.3 Prozesse überwachen – ps, top, kpm | 186 | ||
6.4 Lebenszyklus eines Prozesses | 188 | ||
6.5 Umgebungsvariablen eines Prozesses | 190 | ||
6.5.1 Einzelne Umgebungsvariablen abfragen | 192 | ||
6.5.2 Umgebungsvariable verändern oder hinzufügen – putenv() und setenv() | 193 | ||
6.5.3 Löschen von Umgebungsvariablen – unsetenv() und clearenv() | 196 | ||
6.6 Ressourcenlimits eines Prozesses | 197 | ||
6.6.1 Mehr Sicherheit mit Ressourcen-Limits | 200 | ||
6.7 Prozesserkennung | 200 | ||
6.8 Erzeugung von Prozessen – fork() | 202 | ||
6.8.1 Pufferung | 205 | ||
6.8.2 Was wird vererbt und was nicht? | 209 | ||
6.8.3 Einen Prozess mit veränderter Priorität erzeugen | 209 | ||
6.9 Warten auf einen Prozess | 211 | ||
6.10 Die exec-Familie | 218 | ||
6.10.1 execl() | 219 | ||
6.10.2 execve() | 220 | ||
6.10.3 execv() | 220 | ||
6.10.4 execle() | 220 | ||
6.10.5 execlp() | 221 | ||
6.10.6 execvp() | 221 | ||
6.10.7 Kindprozesse mit exec-Aufruf überlagern | 221 | ||
6.11 Kommandoaufrufe aus dem Programm – system() | 223 | ||
6.12 Dämonprozesse | 224 | ||
6.12.1 Wie ein Prozess zum Dämon wird ... | 224 | ||
6.12.2 Dämon, sprich mit uns ... | 225 | ||
6.12.3 Protokolieren von Dämonen – syslog() | 225 | ||
6.12.4 syslog() in der Praxis | 228 | ||
6.12.5 Den Dämon, den ich rief ... | 230 | ||
6.13 Zusammenfassung und Ausblick | 234 | ||
7 Signale | 235 | ||
7.1 Grundlage zu den Signalen | 235 | ||
7.1.1 Signalmaske | 237 | ||
7.1.2 Signale und fork() | 237 | ||
7.1.3 Signale und exec | 238 | ||
7.1.4 Übersicht zu den Signalen | 238 | ||
7.2 Das neue Signalkonzept | 240 | ||
7.2.1 Wozu ein »neues« Signalkonzept? | 240 | ||
7.3 Signalmenge initialisieren | 241 | ||
7.4 Signalmenge hinzufügen oder löschen | 241 | ||
7.5 Signale einrichten oder erfragen | 241 | ||
7.5.1 Einen Signalhandler einrichten, der zurückkehrt | 246 | ||
7.6 Signal an den eigenen Prozess senden – raise() | 248 | ||
7.7 Signale an andere Prozesse senden – kill() | 248 | ||
7.8 Zeitschaltuhr einrichten – alarm() | 249 | ||
7.9 Prozesse stoppen, bis ein Signal eintritt – pause() | 249 | ||
7.10 Prozesse für eine bestimmte Zeit stoppen – sleep() und usleep() | 249 | ||
7.11 Signalmaske erfragen oder ändern – sigprocmask() | 250 | ||
7.12 Prozess während einer Änderung der Signalmaske stoppen – sigsuspend() | 251 | ||
7.13 Prozesse synchronisieren | 251 | ||
8 IPC (Interprozesskommunikation) | 255 | ||
8.1 Unterschiedliche Interprozesskommunikations- Techniken im Überblick | 255 | ||
8.1.1 (Namenlose) Pipes | 256 | ||
8.1.2 Benannte Pipes (FIFO-Pipes) | 256 | ||
8.1.3 Message Queue (Nachrichtenspeicher) | 258 | ||
8.1.4 Semaphore | 259 | ||
8.1.5 Shared Memory (Gemeinsamer Speicher) | 259 | ||
8.1.6 STREAMS | 259 | ||
8.1.7 Sockets | 260 | ||
8.1.8 Lock Files (Sperrdateien) | 261 | ||
8.1.9 Dateisperren (Record Locking) | 261 | ||
8.2 Gründe für IPC | 262 | ||
8.3 Pipes | 262 | ||
8.3.1 Eigenschaften von Pipes | 263 | ||
8.3.2 Pipes einrichten – pipe() | 263 | ||
8.3.3 Eigenschaften von elementaren E/A-Funktionen bei Pipes | 267 | ||
8.3.4 Standard-E/A-Funktionen mit pipe | 267 | ||
8.3.5 Pipes in einen anderen Prozess umleiten | 269 | ||
8.3.6 Filterprogramm erstellen mithilfe einer Pipe | 271 | ||
8.3.7 Einrichten einer Pipe zu einem anderen Prozess – popen() | 275 | ||
8.3.8 Mail versenden mit Pipes und Sendmail | 276 | ||
8.3.9 Drucken über eine Pipe mit lpr | 279 | ||
8.3.10 Benannte Pipes – FIFOs | 283 | ||
8.4 System V-Interprozesskommunikation | 299 | ||
8.4.1 Gemeinsamkeiten der SysV-Mechanismen | 299 | ||
8.4.2 Ein Objekt einrichten, eine Verbindung herstellen und das Objekt wieder löschen | 301 | ||
8.4.3 Datenaustausch zwischen nicht verwandten Prozessen | 301 | ||
8.5 Semaphore | 301 | ||
8.5.1 Lebenszyklus einer Semaphore | 302 | ||
8.5.2 Ein Semaphor öffnen oder erstellen – semget() | 305 | ||
8.5.3 Abfragen, ändern oder löschen der Semaphoremenge – semctl() | 306 | ||
8.5.4 Operationen auf Semaphoremengen – semop() | 308 | ||
8.5.5 Semphore im Vergleich mit Sperren | 309 | ||
8.6 Message Queues | 309 | ||
8.6.1 Eine Message Queue öffnen oder erzeugen – msgget() | 310 | ||
8.6.2 Nachrichten versenden – msgsnd() | 311 | ||
8.6.3 Eine Nachricht empfangen – msgrcv() | 311 | ||
8.6.4 Abfragen, ändern oder löschen einer Message Queue – msgctl() | 312 | ||
8.7 Shared Memory | 321 | ||
8.7.1 Ein Shared Memory-Segment erstellen oder öffnen – shmget() | 321 | ||
8.7.2 Ein Shared Memory-Segment abfragen, ändern oder löschen – shmctl() | 322 | ||
8.7.3 Ein Shared Memory-Segment anbinden (attach) – shmat() | 323 | ||
8.7.4 Ein Shared Memory-Segment loslösen – shmdt() | 323 | ||
8.7.5 Client/Server-Beispiel – Shared Memory | 324 | ||
9 Threads | 331 | ||
9.1 Wozu Thread-Programmierung? | 331 | ||
9.2 Unterschiede zwischen Threads und Prozessen? | 331 | ||
9.3 Thread-sicher (thread-safe) | 332 | ||
9.4 Thread-Bibliotheken | 332 | ||
9.5 Kernel- Threads und User- Threads | 333 | ||
9.6 Scheduling | 334 | ||
9.7 Die grundlegenden Funktionen zur Thread- Programmierung | 334 | ||
9.8 Jeder Thread ein eigener Prozess? | 337 | ||
9.9 Die Attribute von Threads und das Scheduling | 338 | ||
9.9.1 Erfragen und setzen von Attributen | 339 | ||
9.10 Zwei Threads vergleichen | 341 | ||
9.11 Mutexe | 342 | ||
9.12 Mutex anlegen | 343 | ||
9.13 Mutex sperren und wieder freigeben | 343 | ||
9.14 Mutex löschen | 344 | ||
9.15 Attribute von Mutexen | 348 | ||
9.16 Race conditions mit Condition Variables vermeiden | 349 | ||
9.17 Fehlerbehandlung von Threads | 358 | ||
9.18 Threads und Signale | 360 | ||
9.19 Zusammenfassung | 363 | ||
10 Netzwerkprogrammierung | 365 | ||
10.1 Einführung | 365 | ||
10.2 Aufbau von Netzwerken | 365 | ||
10.2.1 ISO/OSI und TCP/IP – Referenzmodell | 366 | ||
10.2.2 Das World Wide Web (Internet) | 369 | ||
10.3 TCP/IP – Aufbau und Struktur | 370 | ||
10.3.1 Netzwerkschicht (Datenübertragung) | 370 | ||
10.3.2 Internetschicht | 370 | ||
10.3.3 Transportschicht ( TCP, UDP) | 371 | ||
10.3.4 Anwendungsschicht | 371 | ||
10.4 TCP Socket | 373 | ||
10.5 Kommunikationsmodell | 374 | ||
10.6 Grundlegende Funktionen zum Zugriff auf die Socketschnittstelle | 374 | ||
10.6.1 Ein Socket anlegen – socket() | 374 | ||
10.6.2 Verbindungsaufbau – connect() | 376 | ||
10.6.3 Socket mit einer Adresse verknüpfen – bind() | 377 | ||
10.6.4 Auf Verbindungen warten – listen() und accept() | 377 | ||
10.6.5 Senden und empfangen von Daten (1) – write() und read() | 378 | ||
10.6.6 Senden und empfangen von Daten (2) – send() und recv() | 379 | ||
10.6.7 Verbindung schließen – close() | 380 | ||
10.7 Aufbau eines Clientprogramms | 380 | ||
10.7.1 Zusammenfassung Clientanwendung und Quellcode | 383 | ||
10.8 Aufbau des Serverprogramms | 384 | ||
10.8.1 Zusammenfassung: Serveranwendung und Quellcode | 385 | ||
10.9 Weitere Funktionen zur Netzwerkprogrammierung | 389 | ||
10.9.1 inet_aton(), inet_pton() und inet_addr() | 389 | ||
10.9.2 inet_ntoa() und inet_ntop() | 390 | ||
10.9.3 inet_network() | 391 | ||
10.9.4 inet_netof() | 392 | ||
10.9.5 inet_lnaof() | 392 | ||
10.9.6 inet_makeaddr() | 392 | ||
10.9.7 gethostbyname() | 395 | ||
10.9.8 gethostbyaddr() | 396 | ||
10.9.9 herror() | 397 | ||
10.9.10 Informationen zur Portnummern | 398 | ||
10.10 Der Puffer | 402 | ||
10.11 Parallele Server | 403 | ||
10.12 Syncrones Multiplexing – select() | 416 | ||
10.13 POSIX- Threads und Netzwerkprogrammierung | 428 | ||
10.14 Optionen für Sockets setzen bzw. erfragen | 433 | ||
10.14.1 setsockopt() | 433 | ||
10.14.2 getsockopt() | 433 | ||
10.14.3 Socket-Optionen | 434 | ||
10.15 UDP | 437 | ||
10.15.1 Clientanwendung | 439 | ||
10.15.2 Serveranwendung | 439 | ||
10.15.3 recvfrom() und sendto() | 440 | ||
10.16 Multicast-Socket | 444 | ||
10.16.1 Anwendungsgebiete von Multicast- Verbindungen | 451 | ||
10.17 Nicht blockierende I/O-Sockets | 451 | ||
10.18 Etwas zu Streams und TLI, Raw Socket, XTI | 454 | ||
10.18.1 Raw Socket | 454 | ||
10.18.2 TLI und XTI | 455 | ||
10.18.3 RPC (Remote Procedure Call) | 455 | ||
10.19 IPv4 und IPv6 | 456 | ||
10.19.1 IPv6 – Ein wenig genauer | 456 | ||
10.20 Netzwerksoftware nach IPv6 portieren | 457 | ||
10.20.1 Konstanten | 457 | ||
10.20.2 Strukturen | 458 | ||
10.20.3 Funktionen | 458 | ||
10.21 Sicherheit und Verschlüsselung | 459 | ||
11 MySQL und PostgreSQL | 461 | ||
11.1 Relationales Datenbanksystem | 461 | ||
11.2 Relationaler Datenbankserver | 463 | ||
11.3 SQL-Server im Überblick | 464 | ||
11.4 MySQL | 464 | ||
11.4.1 Anwendungsgebiete von MySQL | 465 | ||
11.4.2 Schnittstellen von MySQL | 465 | ||
11.4.3 Installation von MySQL | 465 | ||
11.4.4 MySQL-Server starten und stoppen | 466 | ||
11.4.5 Konfigurationsdatei my.cnf | 466 | ||
11.4.6 Kommandozeilenwerkzeuge für und von mysql | 468 | ||
11.4.7 Grafische Clients | 471 | ||
11.4.8 MySQL-Crashkurs | 472 | ||
11.4.9 Datentypen | 473 | ||
11.4.10 Datenbank anlegen, verwenden und löschen | 476 | ||
11.4.11 Tabelle anlegen | 478 | ||
11.4.12 Schlüsselfelder ( Tabellen anlegen) | 479 | ||
11.4.13 Indices | 479 | ||
11.4.14 Tabellentypen ( Tabellen anlegen) | 480 | ||
11.4.15 Autowerte definieren | 480 | ||
11.4.16 Tabellen umbenennen und ändern | 480 | ||
11.4.17 Daten einfügen, ändern und löschen | 483 | ||
11.4.18 Daten importieren | 485 | ||
11.4.19 Datenausgabe | 485 | ||
11.4.20 NULL ist 0 oder undefiniert? | 487 | ||
11.4.21 Unscharfe Suche | 487 | ||
11.5 MySQL C-API | 488 | ||
11.5.1 Verbindung mit dem MySQL-Server aufbauen | 490 | ||
11.5.2 Aufgetretene Fehler ermitteln – mysql_errno() und mysql_ error() | 492 | ||
11.5.3 Schließt die Verbindung zum Server – mysql_close() | 493 | ||
11.5.4 Erstes Beispiel | 493 | ||
11.5.5 Verschiedene Informationen ermitteln | 498 | ||
11.5.6 Datenbanken, Tabellen und Felder ausgeben (MYSQL_RES) | 501 | ||
11.5.7 Ergebnismenge zeilenweise bearbeiten (MYSQL_ROW) | 503 | ||
11.5.8 Ergebnismenge spaltenweise einlesen (und ausgeben) ( MYSQL_ FIELD) | 505 | ||
11.5.9 Ein Beispiel | 509 | ||
11.5.10 Ergebnismenge – weitere Funktionen | 516 | ||
11.5.11 Befehle an den Server – mysql_query() und mysql_ real_ query() | 517 | ||
11.5.12 Weitere Funktionen | 521 | ||
11.5.13 Veraltete Funktionen | 526 | ||
11.5.14 Neue Funktionen ab Version 4.1.x | 527 | ||
11.6 Beispiel eines Newssystems mit MySQL | 528 | ||
11.6.1 Die Headerdatei my_cgi.h | 529 | ||
11.6.2 (Pseudo-)Planung | 534 | ||
11.6.3 Datenbank und Tabellen anlegen | 535 | ||
11.6.4 MySQL-Clients mit GUI | 555 | ||
11.6.5 Randnotiz | 555 | ||
11.7 Neue SQL-Funktionen für die Shell – MySQL erweitern | 555 | ||
11.8 MySQL-Funktionen mit der UDF-Schnittstelle entwerfen | 557 | ||
11.8.1 UDF-Sequenzen | 558 | ||
11.8.2 UDF_INIT-Struktur | 559 | ||
11.8.3 UDF_ARGS-Struktur | 560 | ||
11.8.4 Rückgabewert | 561 | ||
11.8.5 Benutzerdefinierte Funktionen erstellen | 561 | ||
11.8.6 Benutzerdefinierte Funktion kompilieren, installieren und ausführen | 564 | ||
11.9 PostgreSQL – objektrelationales Datenbankverwaltungssystem | 566 | ||
11.9.1 PostgreSQL im Vergleich zu MySQL | 566 | ||
11.9.2 Unterschiede in der Syntax zwischen MySQL und PostgreSQL | 567 | ||
11.9.3 PostgreSQL installieren | 568 | ||
11.9.4 Konfigurationsdateien bei PostgreSQL – (postgresql.conf, pg_ hba_ conf) | 569 | ||
11.9.5 CRASHKURS PostgreSQL | 571 | ||
11.9.6 PostgreSQL C-API – libpg | 579 | ||
11.9.7 Umgebungsvariablen und Passwortdatei | 600 | ||
11.9.8 PostgreSQL und Threads | 601 | ||
11.9.9 Ausblick | 601 | ||
12 Terminal E/A und Benutzerschnittstellen für die Konsole | 603 | ||
12.1 termios | 603 | ||
12.1.1 Terminalattribute bearbeiten | 604 | ||
12.1.2 Flags setzen und löschen | 609 | ||
12.1.3 Terminal-Idenfizierung | 616 | ||
12.1.4 Geschwindigkeitskontrolle – Baudrate von Terminals einstellen | 617 | ||
12.2 terminfo | 622 | ||
12.2.1 terminfo verwenden | 623 | ||
12.2.2 terminfo initialsieren – setupterm() | 624 | ||
12.2.3 Eigenschaften eines Terminals (Finden von capnames) – tigetflag(), tigetnum() und tigetstr() | 625 | ||
12.2.4 Mit terminfo-Eigenschaften arbeiten – putp(), tputs(), tparm() | 628 | ||
12.3 ncurses – Halbgrafik | 631 | ||
12.3.1 ncurses initialisieren | 631 | ||
12.3.2 Tastaturmodus und Ein- und Ausgabe | 632 | ||
12.3.3 Eigenschaft der Fenster | 642 | ||
12.3.4 Scrolling | 645 | ||
12.3.5 Attribute und Farben setzen | 648 | ||
12.3.6 Fensterroutinen | 653 | ||
12.3.7 Mausprogrammierung mit ncurses | 658 | ||
13 Xlib – X Window-Programmierung | 667 | ||
13.1 Architektur von X | 667 | ||
13.1.1 Pufferung | 668 | ||
13.1.2 Ressourcen | 669 | ||
13.2 X Toolkit | 669 | ||
13.3 Der Windowmanager | 670 | ||
13.4 Fenster mit X | 670 | ||
13.4.1 Verbindung herstellen | 671 | ||
13.4.2 Fenster definieren | 672 | ||
13.4.3 Informationen für den Windowmanager | 673 | ||
13.4.4 Fenster anzeigen | 674 | ||
13.4.5 Fenster und X- Verbindung beenden | 674 | ||
13.4.6 Das Grundgerüst als Quellcode | 674 | ||
13.5 Events | 679 | ||
13.5.1 Event-Maske setzen | 679 | ||
13.5.2 Event-Bearbeitungsschleife | 680 | ||
13.5.3 Abarbeitung der Events | 681 | ||
13.5.4 Tastatur-Event | 681 | ||
13.5.5 Mausbutton-Event | 682 | ||
13.5.6 Expose-Event | 683 | ||
13.5.7 EnterWindowMask – LeaveWindowMask | 683 | ||
13.5.8 Listing zu den Events | 683 | ||
13.6 Grafik mit X | 688 | ||
13.6.1 Grafikprimitive – Zeichenfunktionen | 689 | ||
13.7 Text mit X | 694 | ||
13.7.1 Fonts benutzen | 694 | ||
13.7.2 Übersicht zu den Fonts | 695 | ||
13.7.3 Höhe und Breite ermitteln | 696 | ||
13.7.4 Listing mit Textausgabe | 697 | ||
13.8 Farben mit X | 704 | ||
13.9 Beispiel – Ein Button mit X | 714 | ||
13.10 Wozu kann ich denn nun die Xlib in der Praxis verwenden? | 719 | ||
13.11 X und X- Toolkits – Einführung | 719 | ||
13.12 Toolkit-Programmierung | 719 | ||
13.12.1 Widgets | 720 | ||
13.13 Ein einfaches Fenster mit einem Button | 720 | ||
13.13.1 Ressourcen | 722 | ||
13.14 Zwei Buttons in Box- und Form- Widget mit Textausgabe ( Label- Widget) | 727 | ||
13.15 editres – Widget-Hierarchie | 730 | ||
13.16 Texteingabe mit Dialog- Widget | 731 | ||
13.17 X- Toolkits meets Xlib | 735 | ||
13.18 Zusammenfassung | 738 | ||
14 GTK+ | 741 | ||
14.1 Was ist GTK+? | 741 | ||
14.1.1 Was ist GDK und Glib? | 741 | ||
14.1.2 Schnittstellen von GTK+ zu anderen Programmiersprachen | 743 | ||
14.1.3 GTK+ und GNOME | 743 | ||
14.1.4 GTK+ Version 1.2 und 2.x | 743 | ||
14.1.5 GTK+ – Aufbau des Kapitels | 744 | ||
14.2 GTK+-Anwendungen übersetzten | 745 | ||
14.3 Eine Einführung in die Glib-Bibliothek | 746 | ||
14.3.1 Datentypen | 746 | ||
14.3.2 Routinen | 747 | ||
14.3.3 Assertions-Funktionen | 749 | ||
14.3.4 Speicherverwaltung | 751 | ||
14.3.5 Stringbearbeitung | 754 | ||
14.3.6 Selbstverwaltender Stringpuffer | 758 | ||
14.3.7 Timer | 761 | ||
14.3.8 Dynamische Arrays | 763 | ||
14.3.9 Listen, Hashtabellen und binäre Bäume | 766 | ||
14.3.10 Ausblick Glib | 767 | ||
14.4 Grundlagen der GTK+-Programmierung | 768 | ||
14.4.1 Die Umgebung initialisieren | 768 | ||
14.4.2 Widgets erzeugen und ggf. die Attribute setzen | 768 | ||
14.4.3 Eine Callback-Funktion einrichten, um Events abzufangen | 770 | ||
14.4.4 Eine GTK+-Anwendung beenden | 772 | ||
14.4.5 Die hierarchische Anordnung der Widgets definieren | 774 | ||
14.4.6 Widgets anzeigen | 775 | ||
14.4.7 Signale und Events abfangen und bearbeiten – (Events) Verarbeitungsschleife | 775 | ||
14.4.8 GTK+ und Umlaute (Zeichenkodierung) | 776 | ||
14.5 Fenster – GtkWindow | 777 | ||
14.5.1 Dialogfenster (Dialogboxen) | 781 | ||
14.5.2 GtkMessageDialog | 785 | ||
14.6 Anzeige-Elemente | 785 | ||
14.6.1 Text – GtkLabel | 788 | ||
14.6.2 Trennlinie – GtkSeparator | 791 | ||
14.6.3 Grafiken – GtkImage | 791 | ||
14.6.4 Statusleiste – GtkStatusbar | 792 | ||
14.6.5 Fortschrittsbalken – GtkProgressBar | 793 | ||
14.7 Behälter | 793 | ||
14.7.1 Boxen – GtkBox | 793 | ||
14.7.2 Aufteilungen, Register und Button-Box | 795 | ||
14.7.3 Tabellen – GtkTable | 801 | ||
14.7.4 Ausrichtung – GtkAlignment | 805 | ||
14.8 Buttons und Toogled-Buttons | 806 | ||
14.8.1 Buttons allgemein | 812 | ||
14.8.2 Radio-Buttons (GtkRadioButton) | 813 | ||
14.8.3 GtkRadioButton, GtkCheckButton und GtkToggleButton | 813 | ||
14.8.4 Signale für Buttons (GtkButton) | 814 | ||
14.9 Dateneingabe | 814 | ||
14.9.1 Textfelder – GtkEntry | 821 | ||
14.9.2 Schieberegler – GtkScale | 822 | ||
14.9.3 Zahlenfelder – GtkSpinButton | 823 | ||
14.9.4 Einstellungen – GtkAdjustment | 824 | ||
14.9.5 GtkEditable | 825 | ||
14.10 Menü und Toolbar | 825 | ||
14.10.1 Menü – GtkItemFactory | 830 | ||
14.10.2 Toolbar – GtkToolbar | 835 | ||
14.10.3 Options-Menü – GtkOptionsMenu | 838 | ||
14.10.4 Combo-Boxen – GtkCombo | 839 | ||
14.11 Mehrzeiliger Text | 843 | ||
14.11.1 Text(editor) – GtkTextView, GtkTextBuffer | 851 | ||
14.11.2 Scrollendes Fenster – GtkScrolledWindow | 854 | ||
14.12 Auswählen (Selection) | 855 | ||
14.12.1 Dateiauswahl – GtkFileSelection | 863 | ||
14.13 Events | 864 | ||
14.14 Weitere Widget- und GTK+-Elemente im Überblick | 870 | ||
14.14.1 Bäume und Listen | 870 | ||
14.14.2 Lineale | 870 | ||
14.14.3 Zwischenablage (Clipboard) | 870 | ||
14.14.4 Drag-and-Drop | 871 | ||
14.14.5 Stock Items – Repertoire-Einträge | 871 | ||
14.14.6 Signale | 871 | ||
14.14.7 Ressource-Files | 871 | ||
14.14.8 Widget-Entwicklung | 871 | ||
14.14.9 GDK | 871 | ||
15 SDL | 873 | ||
15.1 Was ist und kann SDL? | 873 | ||
15.2 SDL installieren | 874 | ||
15.3 SDL-Anwendungen erstellen | 874 | ||
15.4 SDL initialisieren und Videomodus einstellen | 875 | ||
15.4.1 Programmbeispiel – SDL initialisieren und Videomodus einstellen | 877 | ||
15.5 Direkt auf den Bildschirm zeichnen | 878 | ||
15.5.1 Programmbeispiel – Direkt auf den Bildschirm zeichnen | 880 | ||
15.6 Bitmap laden und anzeigen | 883 | ||
15.6.1 Programmbeispiel – Bitmap laden und anzeigen | 884 | ||
15.7 Ein anderes Grafikformat laden und anzeigen | 886 | ||
15.8 Der rechteckige Bildbereich von SDL | 887 | ||
15.9 Farbenschlüssel, Transparenz und Alpha-Blending | 890 | ||
15.9.1 Alpha-Blending | 891 | ||
15.10 Animation | 892 | ||
15.10.1 Programmbeispiel – Animation | 894 | ||
15.11 Eingabe- und Ereignissverarbeitung | 899 | ||
15.11.1 SDL-Event-Struktur | 900 | ||
15.11.2 Maus-Events | 902 | ||
15.11.3 Programmbeispiel – Maus-Event | 904 | ||
15.11.4 Tastatur-Events | 909 | ||
15.11.5 Programmbeispiel – Tastatur-Events | 912 | ||
15.11.6 Joystick-Events | 915 | ||
15.11.7 Programmbeispiel – Joystick-Events | 918 | ||
15.11.8Weitere Events | 920 | ||
15.12 Audio | 921 | ||
15.12.1 Programmbeispiel – Audio | 923 | ||
15.13 Ausblick | 926 | ||
16 Werkzeuge für Programmierer | 929 | ||
16.1 Der Compiler: gcc | 929 | ||
16.1.1 Standardgebrauch des gcc | 931 | ||
16.1.2 Linken von Programmbibliotheken | 931 | ||
16.1.3 Dateien, die GCC kennt | 932 | ||
16.1.4 Ausgabe-Dateien bei jedem einzelnen Schritt der Übersetzung erstellen | 933 | ||
16.1.5 Noch mehr Optionen | 934 | ||
16.1.6 Optionen für Warnmeldungen | 934 | ||
16.1.7 Präprozessor-Optionen | 935 | ||
16.1.8 Debuggen und Profiling | 935 | ||
16.1.9 Optimierungsflags | 935 | ||
16.2 Make | 936 | ||
16.2.1 Erzeugen eines Makefiles | 938 | ||
16.2.2 Variablen, Makros und Abkürzungen | 944 | ||
16.2.3 Implizite Regeln | 947 | ||
16.2.4 Musterregeln | 948 | ||
16.2.5 make zur Installation verwenden | 949 | ||
16.2.6 make-Optionen | 950 | ||
16.2.7 Ausblick | 950 | ||
16.3 Bibliotheken erstellen | 951 | ||
16.3.1 Statische Bibliotheken erstellen | 951 | ||
16.3.2 Dynamische Bibliotheken (shared libraries) erstellen | 954 | ||
16.3.3 Dynamisches Nachladen von Bibliotheken | 957 | ||
16.4 RPM | 959 | ||
16.4.1 Einführung in RPM | 960 | ||
16.4.2 Installieren – rpm -i | 960 | ||
16.4.3 Deinstallieren – rpm -e | 960 | ||
16.4.4 Aktualisieren – rpm -U | 961 | ||
16.4.5 Weiteres | 961 | ||
16.4.6 Benötigte Komponenten für ein einfaches RPM | 961 | ||
16.4.7 Verzeichnisse die RPM benötigt | 962 | ||
16.4.8 Ein eigenes RPM-Paket erstellen | 962 | ||
16.4.9 Sources | 962 | ||
16.4.10 Die Spec-Datei | 963 | ||
16.4.11 Paket erstellen | 966 | ||
16.4.12 Das Paket installieren | 968 | ||
16.5 RCS und CVS | 970 | ||
16.5.1 Software Configuration Management Systeme (SCM) | 970 | ||
16.5.2 RCS | 971 | ||
16.5.3 CVS | 980 | ||
16.6 Zeitmessung von Programmen | 996 | ||
16.6.1 Einfache Zeitmessung mit TIME – Laufzeit von Prozessen | 996 | ||
16.6.2 Profiling mit GPROF – Laufzeit von Funktionen | 997 | ||
16.6.3 Analyse mit GCOV | 1001 | ||
16.7 Debuggen mit gdb und ddd | 1003 | ||
16.8 STRACE – Systemaufrufe verfolgen | 1014 | ||
16.9 Memory Leaks und unerlaubte Speicherzugriffe | 1016 | ||
16.9.1 efence | 1016 | ||
16.9.2 valgrind | 1019 | ||
16.10 Ausblick | 1023 | ||
A Sicherheit unter Linux | 1025 | ||
A. 1 Viren und Trojaner | 1025 | ||
A.2 Der Superuser (su) | 1026 | ||
A.3 Überlaufen von Logfiles | 1026 | ||
A.4 Zugriffsrechte auf Dateien | 1027 | ||
A.5 Das SUID-Bit | 1027 | ||
A.6 Programme ohne Ausführrechte | 1029 | ||
A.7 Buffer Overflow (Pufferüberlauf) | 1029 | ||
A.8 Race Condition | 1032 | ||
A.9 Temporäre Dateien | 1033 | ||
A. 10 chroot | 1033 | ||
A. 11 Umgebungsvariablen | 1034 | ||
A. 12 Zugriffsrechte – häufig gemachte Fehler | 1035 | ||
A. 13 system() und popen() | 1035 | ||
B Funktionsreferenz | 1037 | ||
B. 1 ANSI C | 1037 | ||
B. 1.1 |
1038 | ||
B. 1.2 |
1038 | ||
B. 1.3 |
1039 | ||
B. 1.4 |
1040 | ||
B. 1.5 |
1041 | ||
B. 1.6 |
1042 | ||
B. 1.7 |
1045 | ||
B. 1.8 |
1046 | ||
B. 1.9 |
1047 | ||
B. 1.10 |
1047 | ||
B. 1.11 |
1049 | ||
B. 1.12 |
1050 | ||
B. 1.13 |
1052 | ||
B. 1.14 |
1054 | ||
B. 1.15 |
1056 | ||
B.2 ANSI C99 | 1057 | ||
B.2.1 |
1058 | ||
B.2.2 |
1058 | ||
B.2.3 |
1059 | ||
B.2.4 |
1059 | ||
B.2.5 |
1059 | ||
B.2.6 |
1062 | ||
B.2.7 |
1062 | ||
B.2.8 |
1062 | ||
B.2.9 |
1063 | ||
B.2.10 |
1065 | ||
B.3 Elementare E/A-Funktionen | 1065 | ||
B.3.1 Limits-Konstanten | 1066 | ||
B.3.2 Elementare E/A-Funktionen | 1067 | ||
B.4 Fortgeschrittene Ein-/Ausgabe-Funktionen | 1068 | ||
B.4.1 Multiplexing Ein-/Ausgabe – select() | 1068 | ||
B.4.2 Memory Mapped Ein-/Ausgabe | 1069 | ||
B.5 Verzeichnisse | 1074 | ||
B.6 Attribute von Dateien und Verzeichnissen | 1076 | ||
B.6.1 Funktionen zum Erfragen der Dateiattribute | 1077 | ||
B.6.2 Funktionen zum Erfragen oder Setzen bestimmter Zugriffsrechte | 1079 | ||
B.7 Links | 1080 | ||
B.8 Prozess und Prozessverwaltungsfunktionen | 1080 | ||
B.8.1 Umgebungsvariablen (Environment) eines Prozesses | 1080 | ||
B.8.2 Ressourcen-Limits eines Prozesses abfragen oder setzen | 1080 | ||
B.8.3 Prozesserkennung erfragen bzw. setzen | 1081 | ||
B.8.4 Prozesssteuerung | 1082 | ||
B.9 Signale – Das neue Signalkonzept | 1082 | ||
B.9.1 Signalmengen | 1082 | ||
B.9.2 (POSIX) Signalhandler-Funktionen | 1083 | ||
B.9.3 Übersicht zu den Signalen | 1083 | ||
B.9.4 Signale senden und Prozesse suspendieren | 1086 | ||
B. 10 Interprozesskommunikationen | 1086 | ||
B. 10.1 Pipes | 1086 | ||
B. 10.2 FIFO (Benannte Pipe) erzeugen | 1087 | ||
B. 11 Sys- V-Interprozesskommnunikationen | 1087 | ||
B. 11.1 Message Queue | 1087 | ||
B. 11.2 Semaphor | 1088 | ||
B. 11.3 Shared Memory | 1088 | ||
B. 12 Threadprogrammierung | 1089 | ||
B. 12.1 Thread- Verwaltung | 1090 | ||
B. 12.2 Attribute von Threads und das Scheduling erfragen | 1090 | ||
B. 12.3 Attribute und das Scheduling von Threads setzen | 1091 | ||
B. 12.4 Mutex - Variablen | 1091 | ||
B. 12.5 Attribute von Mutexe | 1092 | ||
B. 12.6 Condition Variablen | 1093 | ||
B. 12.7 Threads beenden | 1093 | ||
B. 13 Netzwerkprogrammierung | 1094 | ||
B. 13.1 Grundlegende Socket-Funktionen | 1094 | ||
B. 13.2 Konvertieren zur richtigen Byteanordnung | 1096 | ||
B. 13.3 Abfragen von Netzwerknummern und Internetadressen | 1097 | ||
B. 13.4 Hostnamen aus der Host-Datenbank ermitteln | 1098 | ||
B. 13.5 Service-Datenbank | 1099 | ||
B. 14 MySQL C-API | 1100 | ||
B. 14.1 Übersetzen einer Anwendung | 1100 | ||
B. 14.2 Die MySQL C-API | 1100 | ||
B. 14.3 Datentypenübersicht der C-API | 1104 | ||
B. 15 PostgreSQL C-API | 1105 | ||
B. 15.1 Übersetzen einer Anwendung | 1105 | ||
B. 15.2 Eine Verbindung zum PostgreSQL-Server herstellen | 1105 | ||
B. 15.3 Status und Informationen zur Verbindung ermitteln | 1106 | ||
B. 15.4 Verbindung beenden oder wieder aufnehmen | 1107 | ||
B. 15.5 SQL-Anfragen an den Server machen und den Status auswerten | 1107 | ||
B. 15.6 Ergebnis einer SQL-Anfrage auswerten | 1107 | ||
B. 15.7 Rückgabe des Anfrageergebnisses auslesen | 1108 | ||
B. 15.8 Ergebnisse anderer Befehle ermitteln | 1109 | ||
B. 16 Weitere Funktionsreferenzen auf der Buch-CD | 1109 | ||
C Inhalt der Buch-CD (nicht zum eBook erhältlich) | 1111 | ||
Index | 1113 |