Perl - Win32 - Wie eine blockierungsfreie Lesen eines Dateihandle von einem anderen Prozess zu tun?
-
02-07-2019 - |
Frage
Ich schreibe einige Server-Code, der auf einem Client-Prozess über STDIN spricht. Ich versuche, einen Ausschnitt aus Perl-Code zu schreiben, die asynchron Antworten von der Client-STDOUT empfängt. Die Sperrung Version des Codes könnte wie folgt aussehen:
sub _read_from_client
{
my ($file_handle) = @_;
while (my $line = <$file_handle>) {
print STDOUT $line;
}
return;
}
Wichtig ist, muss der Code-Schnipsel in Win32-Plattform arbeiten. Es gibt viele Lösungen für * nix-Plattformen, die ich nicht interessiert bin. Ich bin mit ActivePerl 5.10.
Lösung
dieses Thema auf PerlMonks empfiehlt Ihnen, einen Socket nicht blockierend auf Windows in Perl auf diese Weise machen können:
ioctl($socket, 0x8004667e, 1);
Weitere Informationen und Ressourcen in diesem Thread
Andere Tipps
Wenn Sie möchten, um die Low-Level-Route nicht gehen, werden Sie an den anderen mehr frameworked Lösungen suchen.
Sie können eine fädeln von dem Eingang zu lesen und haben es alle Daten stopfen es liest in einem Thema :: Queue, die Sie dann in Ihrem Haupt-Thread behandeln.
Sie können sehen POE , die ein ereignisbasiertes Framework implementiert, insbesondere POE :: Rad :: Run :: Win32 . Eventuell kann man auch den Code aus stehlen die nonblocking liest selbst zu implementieren.
können Sie betrachten [Coro], die ein kooperatives Multitasking-System mit Koroutinen implementiert. Dies ist meist ähnlich wie Fäden, außer dass Sie User-Space-Threads erhalten, nicht System-Threads.
Sie haben nicht angegeben, wie weit Sie gehen wollen, aber Ihre Wahl ist zwischen sysread
und einem Rahmen oder Schreiben der Rahmen selbst. Der einfachste Weg zu gehen ist nur Threads zu verwenden oder über den Code von Poe::Wheel::Run::Win32
gehen.