バックグラウンド処理をforkする意味
初歩的な質問かもしれませんが…
デーモンなどではなく、あくまでも通常のCGIスクリプトにおいて、何か重い処理をさせる場合は、STDOUTをcloseして処理はforkで生成した子プロセスにさせる、するとユーザーを待たせることなく(ブラウザをビジーから開放し)処理はバックグラウンドで実行される、という方法がよく見られるのですが、素朴な疑問があります。
ブラウザを開放させるにはSTDOUTをcloseすれば良い、
では、なぜ処理を子プロセスにさせなければならない?
という点です。
一応、以下のような簡単なコードで試してみました。
-----------------
use Date::Format;
my $log_file = 'hogehoge/test.log';
my $start = time2str('%m-%d %T', time);
print "Content-Type: text/plain\n\n";
print "start:$start";
close(STDOUT);
&heavy_exe($start);
exit;
sub heavy_exe {
my $start = $_[0];
sleep(15);
my $now = time2str('%m-%d %T', time);
open(LOG, ">>$log_file") or &error('cant_open');
print LOG "$start\t$now\n";
close(LOG);
}
-----------------
実行してみると、ブラウザはすぐさま開放される(読み込み完了になる)のと、15秒後にロギングも問題なく行われ、また本当に開放されていることを確認するために表示から15秒以内にリロードさせても、問題なく2プロセスとも動いていました。
以上を見る限りでは、forkなんてしなくても単にブラウザを開放するだけでいい、STDOUTをcloseするだけでバックグラウンド処理されると思うのですが、どうなのでしょう。
あるいは何か環境に依存した、子プロセスにさせなければならない理由などがあるのでしょうか。
よろしくお願いいたします。
お礼
n-akira様。回答いただきまして誠にありがとうございました。また利用方法がわからず、御礼が遅れましたことお詫び申し上げます。 回答を確認いたしましたところ、確かに変な動きがありました。ウイルスではないかと思われます。別のウイルス除去ソフトを利用しようと思います。 有難うございます。