perlで組んだCGIでバッファのフラッシュが上手く行かない
どうやら年が明けたらしい。今年もよろしくお願いします。
まあそれはさておき、せっかくの休暇なので昨年中にやってきたことをおさらいしようと
perlやらCやらを弄っている日々を過ごしていたが、タイトルにもあるように
CGIでSTDOUTのバッファをフラッシュする処理を行わせようとしたところ、
子プロセスの処理が終わったと同時に全ての出力が行われるようになってしまっている。
#!/usr/bin/perl use strict; use Sys::Hostname; use POSIX "sys_wait_h"; my $start = time; my $host = hostname; my $now; my $ago = time; $| = 1; print "Content-type:text/plain; charset=EUC-JP\n\n"; print "hostname: $host\n"; print "start...\n\n"; unless (fork()) { sleep 12; print "\n"; exec('/bin/ls /tmp'); } while ((waitpid(-1, &WNOHANG)) == 0) { $now = time; if (($now - $ago) >= 3) { print "."; $ago = time; } } my $end = time; my $total = $end - $start; print "\nend. status: $? total: $total\n"; exit 0;
上記を検証に使用した。
子プロセスの処理が終わるまで、親プロセス上で3秒ごとに”.”を表示するスクリプトだ。
会社のWebサーバでは上手く実装できたのになー。
会社ではapache1.3系を使っており、対する自宅サーバではapache2.2系を使っている
という誤差はあるものの、この手の機能は基礎的な機能のはずなので
そう大差があるはずはないのだが……
apacheのfork周りの設定か、apacheをコンパイルする時の問題でもあるのだろうか?
あ、ちなみにコンソール上で
# perl test.pl
として実行すると狙い通りの動作になる。
……ので、さらに謎が深まる。