Lösung mit einem Prozeß VI

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]

chatserver.pl
sub handle_write {
   my $handle = shift;
   my $handler = $handler{$handle};
   my $line = shift @{$handler->{'obuf'}};
   $write->remove($handle) unless @{$handler->{'obuf'}} > 0;
   unless (defined(syswrite($handle, $line,
                            length($line)))) {
      quit($handle);
   }
}

*Eine offene Verbindung ist genau dann in der Menge $write mit dem zugehörigen Bearbeiter handle_write vertreten, wenn der Ausgabe-Puffer obuf nicht leer ist.
 
*Bei jedem Aufruf von handle_write wird genau eine Zeile ausgegeben. Hierfür wird syswrite verwendet, da dies direkt auf write(2) zurückgeht und ungepuffert ist.
 
*Wenn der Ausgabe-Puffer dabei geleert wird, dann wird die Verbindung aus der Menge $write entfernt.
 
*Dieser Lösung liegt die naive Annahme zugrunde, daß die Ausgabe einer Zeile immer blockierungsfrei klappen wird, obwohl nur ein Byte sicher geschrieben werden kann und die Länge der Zeilen nicht begrenzt ist.
 
*Besser wäre es, hier mit nicht-blockierender Ausgabe zu arbeiten -- aber dann wäre auch die Eingabe nicht-blockierend, oder es müßte ständig hin- und hergeschaltet werden.
 

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]
Copyright © 1996, 1998, 1999, 2000 Andreas Borchert, in HTML konvertiert am 07.02.2000