Perl-Win32-別のプロセスからファイルハンドルの非ブロッキング読み取りを行う方法

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

質問

STDINを介してクライアントプロセスと通信するサーバーコードを記述しています。クライアントのSTDOUTから非同期的に応答を受け取るperlコードのスニペットを作成しようとしています。コードのブロックバージョンは次のようになります。

sub _read_from_client
{
   my ($file_handle) = @_;
   while (my $line = <$file_handle>) {
      print STDOUT $line;
   }
   return;
}

重要なことに、スニペットはWin32プラットフォームで動作する必要があります。興味のない* nixプラットフォーム用のソリューションはたくさんあります。ActivePerl5.10を使用しています。

役に立ちましたか?

解決

。 org "rel =" nofollow noreferrer "> Perlmonks は、WindowsでPerlを使用してソケットをブロックしないようにすることを提案しています。

ioctl($socket, 0x8004667e, 1);

そのスレッドの詳細とリソース

他のヒント

低レベルのルートに行きたくない場合は、他のよりフレームワーク化されたソリューションを検討する必要があります。

スレッドを使用して、入力から読み取り、すべてのデータを詰め込むことができます Thread :: Queue を読み取り、メインスレッドで処理します。

POE をご覧ください。これは、イベントベースのフレームワーク、特に POE :: Wheel :: Run :: Win32 。潜在的に、コードを盗んでノンブロッキング読み取りを実装することもできます。

[Coro]は、コルーチンを使用して協調的なマルチタスクシステムを実装しています。これは、システムスレッドではなくユーザースペーススレッドを取得することを除いて、ほとんどスレッドに似ています。

どこまで行きたいかは述べていませんが、選択は sysread とフレームワークのどちらか、またはフレームワークを自分で書くことです。最も簡単な方法は、スレッドを使用するか、 Poe :: Wheel :: Run :: Win32 のコードを使用することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top