Christian Kruse: Wie funktioniert can_read von IO::Select?

Beitrag lesen

你好 Pygo,

Hallo,

Mich würde mal die genaue Funktionsweise von der Funktion interessieren

IO::Select ist ein Wrapper um den select(2)-Systemcall. Der prüft, bei
welchen Deskriptoren ein read(2)- bzw. ein write(2)-Call nicht blockieren
würde.

Warum ich es wissen möchte: Ich möchte gerne aus jedem Handle nur genau
eine Zeile auslesen pro Schleifendurchgang (also auch pro can_read()-
Aufruf). Jetzt kommt es aber vor, dass das Handle nicht als lesbar von
der Funktion erkannt wird, wenn gerade nichts 'neues' in das Handle
gelangt ist (handelt sich zB um eine pipe), auch wenn noch ein paar
Zeilen zu lesen wären.

Ist das ein Problem der Funktion oder muss es irgendwie an mir liegen?

can_read() prüft auf Blockierung. Wenn du vorher schon von dem Socket
gelesen hast, kann es sein, dass alles gelesen wurde, was zu lesen da war
und die Daten zwischengecached wurden. Das machen z. B. der <>-Operator
oder die read()-Funktion von Perl gerne (block-buffered reading). Benutze
sysread(), um das Problem zu vermeiden; das ist ein echter[tm] Wrapper
um den read(2)-Systemcall und wirklich unbuffered.

再见,
 克里斯蒂安

--
89,7% aller Statistiken sind frei erfunden!
http://wwwtech.de/