A. Willemer Wie werde ich UNIX-Guru
| | I ANWENDUNG |
Know-How für Unix/Linux-User: Einführung, Shell, Befehle, Hilfe, Arbeit mit Dateien, Editoren, Reguläre Ausdrücke, nützliche Tools, Hardware.
|
II ADMINISTRATION |
Tools, Systemstart, Benutzer verwalten, Hardware konfigurieren, Software installieren, Datensicherung, Tuning, Kernel
|
III NETZWERK |
Client/Server Systeme, TCP/IP, Routing, IPv6, Internet-Dienste, DHCP, Webserver, Firewalls
|
IV DAS X-WINDOW SYSTEM |
Die grafische Oberfläche von UNIX einrichten und nutzen
|
V PROGRAMMIERUNG VON SHELLSKRIPTEN |
Automatisieren von Tasks durch Shell-Skripte.
|
VI PERL |
Interpreter, Syntax, Variablen, Steuerung, Funktionen, UNIX-Aufrufe, GUIs mit Tk
|
VII PROGRAMMIERWERKZEUGE |
C-Compiler, Analyse-Tools, CVS, yacc, diff
|
VIII UNIX-SYSTEMAUFRUFE |
UNIX-Befehle in eigenen Programmen nutzen
|
IX LITERATUR |
Weiterführende Literatur zu UNIX und LINUX
|
| |
Ein anderes Thema der Socketprogrammierung ist die parallele Bearbeitung
mehrerer Ports durch einen einzigen Prozess. Ein Beispiel für ein solches
Programm ist inetd , der so genannte Internetdämon, der für alle in der
inetd.conf aufgeführten Ports die Anfragen entgegen nimmt und den
benötigten Server aufruft. Er arbeitet mit dem Aufruf select() , der
mehrere Dateideskriptoren und damit Sockets parallel abhorchen kann.
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int MaxHandle, fd_set *Lesen,
fd_set *Schreiben, fd_set *OutOfBand,
struct timeval *TimeOut);
Zentrale Objekte sind in diesem Zusammenhang die Dateideskriptorenarrays.
Von diesen nimmt select() drei an. Da gibt es je einen Satz
zum Lesen, zum Schreiben oder um Ausnahmen, wie Nachrichten außerhalb
der Reihe zu beobachten. Wollen Sie nicht alle Kategorien beobachten, geben
Sie bei den uninteressanten Parametern den Wert NULL an.
Sollen die Sockets a und b zum Lesen beobachtet werden, dann
muss ein fd_set angelegt und damit gefüllt werden:
fd_set lesesockets;
FD_ZERO(&lesesockets);
FD_SET(a, &lesesockets);
FD_SET(b, &lesesockets);
maxHandle = max(a, b) + 1;
select(maxHandle, &lesesockets, NULL, NULL, NULL);
select() blockiert so lange, bis auf einem der Sockets Daten ankommen.
Soll ein Timeout definiert werden, so muss der letzte Parameter besetzt werden.
Dann wird die Funktion nach einer gewissen Zeitspanne unterbrochen, die in einer
Variablen von Typ timeval festgelegt wird, und als letzter Parameter an
select() übergeben wird. Im Beispiel wird eine zehntel Sekunde eingestellt.
struct timeval myTime;
...
myTime.tv_sec = 0;
myTime.tv_usec = 100000;
select(maxHandle, &lesesockets, NULL, NULL, &myTime);
Die Fähigkeit von select() , einen Timeout im Mikrosekundenbereich
festzulegen,
wird manchmal dazu missbraucht, um einen Prozess für kurze Zeit schlafen zu
legen. Die eigentlich dafür zuständige Funktion sleep() legt einen Prozess
für mindestens eine Sekunde schlafen, was manchmal zu viel ist.
Um dies zu erreichen, kann man die ersten vier Parameter auf 0 setzen.
| |
|
|
Ihre Meinung? |
|
|
|
|
| |
| |
Shopping |
|
Versandkostenfrei bestellen in Deutschland und Österreich Info
|
|
| |
| |
|