Perl-Win32-別のプロセスからファイルハンドルの非ブロッキング読み取りを行う方法
-
02-07-2019 - |
質問
STDINを介してクライアントプロセスと通信するサーバーコードを記述しています。クライアントのSTDOUTから非同期的に応答を受け取るperlコードのスニペットを作成しようとしています。コードのブロックバージョンは次のようになります。
sub _read_from_client
{
my ($file_handle) = @_;
while (my $line = <$file_handle>) {
print STDOUT $line;
}
return;
}
重要なことに、スニペットはWin32プラットフォームで動作する必要があります。興味のない* nixプラットフォーム用のソリューションはたくさんあります。ActivePerl5.10を使用しています。
解決
ioctl($socket, 0x8004667e, 1);
そのスレッドの詳細とリソース
他のヒント
低レベルのルートに行きたくない場合は、他のよりフレームワーク化されたソリューションを検討する必要があります。
スレッドを使用して、入力から読み取り、すべてのデータを詰め込むことができます Thread :: Queue を読み取り、メインスレッドで処理します。
POE をご覧ください。これは、イベントベースのフレームワーク、特に POE :: Wheel :: Run :: Win32 。潜在的に、コードを盗んでノンブロッキング読み取りを実装することもできます。
[Coro]は、コルーチンを使用して協調的なマルチタスクシステムを実装しています。これは、システムスレッドではなくユーザースペーススレッドを取得することを除いて、ほとんどスレッドに似ています。
どこまで行きたいかは述べていませんが、選択は sysread
とフレームワークのどちらか、またはフレームワークを自分で書くことです。最も簡単な方法は、スレッドを使用するか、 Poe :: Wheel :: Run :: Win32
のコードを使用することです。