Thread Frage zu sysread
(18 answers)
Opened by bianca at 2013-10-01 09:18
Mir scheint das Problem zu sein, das das aufgerufenen Programm kein "update" für das Handle sendet. Perl erwartet das ihm mitgeteilt wird, das neue Daten im Transferpuffer sind. Das wird bei POSIX konformen System von diesen gehandhabt, unter Windows scheint das Programm dafür zuständig zu sein (oder das Programm macht irgend einen Mist mit dem System). Mit dem while sysread umgehst du das. Perl schaut von sich aus nach ob Daten im Puffer sind. Der Nachteil ist aber das Perl auf das "update"-Signal wartet wenn der Puffer leer ist.
Du könntest schauen ob du das lesen nicht nonblocking machen kannst. Dann wartet perl nicht am sysread sondern gibt 0 zurück. Nachteil ist dann das man selber schauen muss ob das handle noch offen ist, das Programm also noch läuft, sonst beschwert sich Perl dass man versucht von einem geschlossenen Handle zu lesen, oder das script macht weiter obwohl noch Daten kommen, weil einmal aus einem leeren Puffer gelesen wurde. Eine einfachere Lösung fällt mir nicht ein. Sysread wird empfohlen weil das die Perlinternen Puffer und Filter umgeht. Das kann bei Pipes zu Problemen führen, wenn z.B zerteilte UTF8 Zeichen gelesen werden, oder "\r\n" gesplittet gelesen wird. Perl hat das mittlerweile ganz gut im Griff, aber die Funktionen können einem natürlich auch dazwischen funken. Du kannst sysread nutzen, darfst das nur nicht mit read / readline mischen, da kommt Müll raus. |