Perl - Win32 - Wie eine blockierungsfreie Lesen eines Dateihandle von einem anderen Prozess zu tun?

StackOverflow https://stackoverflow.com/questions/141332

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top