Hallo,

>Wie kann man gleichzeitig eine Zeile text vom Benutzer lesen und etwas
>ausgeben? Mir geht es vor allem darum wie man einen chat client für ein
>Terminal schreiben kann.

>(ja, von select() hab ich auch schon gehört, wäre gerade
>für einen chat client ja durchaus nett). 

Und genau das ist die Lösung. Ein Chat-Client, IRC Client,
Terminalprogramm etc. arbeitet so:

- initialisiere das Terminal
- baue die nötigen Netzwerkverbindungen etc. auf
* warte mit select() oder neuerdings poll() darauf, dass sich auf einem
  der geöffneten Verbindungen etwas tut (d.h. neue Daten anliegen)
  + wenn die Daten vom Netzwerk kommen
    - lese mit einem Nonblocking System Call alles aus, was gekommen
      ist
    - gib es am Bildschirm aus
  + wenn neue Daten am Terminal anliegen
    - lies sie mit einem Nonblocking System Call ein
    - schiebe sie auf das Netzwerk
  + prüfe eine Abbruchbedingung und steige ggf. aus dem Programm aus
- ansonsten weiter bei *

Wichtig ist eigentlich nur, dass alle System Calls außer dem select()
selber nonblocking sein müssen. Ansonsten könnte einer alle Verbindungen
blockieren. Außerdem sollte man beim Einlesen der verfügbaren Daten
eine Obergrenze festlegen, damit Daten von anderen Kanälen auch drankommen.

Mit diesem Schema kann man nicht nur zwei, sondern tausende von Verbindungen
gleichzeitig bedienen. Bekannte Beispiele sind der Web-Proxy Squid, der
IRD Server ircd oder der Webserver thttpd.

Zumindest früher, als die meisten Rechner noch Uniprozessorsysteme waren,
galt dieser Ansatz als performanter als fork() oder Thread-basierte
Programmiermodelle. Ein interessanter, wenngleich veralteter Performance-
vergleich zwischen verschiedenen HTTP Servern verdeutlicht das:
http://www.acme.com/software/thttpd/benchmarks.html

Heute kann man mit select() basierenden Serverdiensten die Performance
eines Multiprozessorsystems nicht mehr auslasten. Der Vorteil ist aber,
dass es nur einen Core belegt und den Load des Systems um nicht mehr als
1 erhöht.

Gruß, Harald
--
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org

Antwort per Email an