私は外部ツール(cleartool)を使ってファイルのリストに関する情報を収集するPerlスクリプトを持っています。 IPCを使用して、各ファイルの新しいプロセスを生成しないようにします。WindowsでノンブロッキングIPC読み取りを実行するにはどうすればよいですか?
use IPC::Open2;
my ($cin, $cout);
my $child = open2($cout, $cin, 'cleartool');
単一行を返すコマンドはうまく機能します。例えば複数行を返す
print $cin "describe -short $file\n";
my $description = <$cout>;
コマンドブロックでハングアップ取得せずに全体の応答を消費する方法については行き止まりで私を持っているが読んで:私はファイルハンドルを設定しようとした
print $cin "lshistory $file\n";
# read and process $cout...
非ブロッキングがfcntl
経由で読み込む:
use Fcntl;
my $flags = '';
fcntl($cout, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl($cout, F_SETFL, $flags);
けどをFcntlは、メッセージに死ぬ「あなたのベンダーが定義されていないをFcntlマクロF_GETFL。」
IO :: Handleを使って$cout->blocking(0)
を設定しようとしましたが、失敗しました(undef
を返し、$!
を "不明なエラー"に設定します)。
私は読み取ろうとする前に、利用可能なデータがあるかどうかを決定するためにselect
を使用しようとしました:
my $rfd = '';
vec($rfd, fileno($cout), 1) = 1;
while (select($rfd, undef, undef, 0) >= 0) {
my $n = read($cout, $buffer, 1024);
print "Read $n bytes\n";
# do something with $buffer...
}
が、それは今まで何も読まずにハングアップします。誰でもこの作業を(Windows上で)行う方法を知っていますか?
IOでブロックしていない間に何をする予定ですか? – jrockway
私はデータを取得するのを止めるまで読んでみたいと思います。これは、すでに取得したデータを解析して最終的に達成したと判断するよりも信頼性が高いようです。 (これは最後の行であることはデータにはありません) –
関連する問題を調べると、GitHubでこのコミットが検出されました。これは非ブロックソケットを作るために黒い魔法を呼び起こすようです:https:// github .com/kthakore /フリーズバブル/コミット/ 735dd2307455e32c69827e013992c2d022cb7347 –