こちらの記事を参考にさせていただきました。
http://perlcode.hateblo.jp/entry/20120321/1332488265
プロセスがずっとreadしつづけている?
ダウンロードが完了してうまくいっているように見えたのですが、
プロセスが残り続ける症状が出ました。
「strace -r -p {プロセス番号}」で、該当のプロセスを調べてみると、
ずっとreadし続けていました。
どうやらコールバックのループがうまく終了できていない様子。
コードを確認してみると以下の部分に原因がありそうでした。
my $length = sysread($fh, my $buffer, $size); unless (defined $length) { close $fh; undef $cb; return; }
sysreadは読み込み失敗するとundefを返すのですが、
読み込むデータがない場合は0を返します。
該当のコードは終了処理に入っていませんでした。
以下のように修正しました。修正の仕方にちょっと自信がありませんが...
my $length = sysread($fh, my $buffer, $size); unless ($length) { $c->write_chunk($buffer); close $fh; undef $cb; return; }