CGI-Perlのforkで子供を置き去りにするには?

[上に] [前に] [次に]
ちゃいパパ [E-Mail] [HomePage] 1999/10/12(火) 16:01:26
CGI-Perlのforkで、重い処理を子供にやらせ、
親は軽い処理をしてすぐブラウザに戻りたいのですが、
子供が終わるまで戻ることができません。
子供を置き去りにして戻る方法を教えて下さい!!

ぎん [E-Mail] 1999/10/12(火) 18:32:22
私は、あまり詳しくはないのですが、
forkを使わなければ、ならないのでしょうか?

もし、UNIX系のサーバーなら、
その重い処理を、別のperlなどにして於いて、
system("perl.pl [パラメータ] & ");
の様にして、&マークを着ける事により、別タスクとして
呼び出せます。

参考にならなかったかもしれませんね。

B-Cus 1999/10/13(水) 00:07:21
うちの apache-1.3.0 では system("command &") でも
 if ( fork ){ # おや
 } else { # こ
  sleep(100);
 }
でも待たされました。STDOUT がオープンされっぱなしだから(かな?)。なので、
 $|=1;
 print "Content-type: text/html\n\nOK.\n";
 if ( fork ){ # おや
  close(STDOUT);
 } else { # こ
  close(STDOUT);
  sleep(100);
 }
とか。

まぁ、それなら fork せずに
 close(STDOUT);
 sleep(100);
でもいいんだけど、ダメな環境もある模様。
 ../199909/99090185.htm
ところで、今回のように fork して close(STDOUT) しても待たされますか?>ふじさん
# Win の perl って fork できないんでしたっけ?


ただし、あまりにも長い処理をしていると、子プロセスにシグナル
飛んでくるかもしんない。その場合は適当にシグナルをブロックして下さい。

ふじ 1999/10/13(水) 02:04:10
># Win の perl って fork できないんでしたっけ?
出来ません。
% perl -e "fork"
The Unsupported function fork function is unimplemented at -e line 1.

>まぁ、それなら fork せずに
> close(STDOUT);
> sleep(100);
>でもいいんだけど、ダメな環境もある模様。
具体的には、Windowsの Apache1.3.6 では駄目でした。

手元の Linux + Apache1.3.3 だと B-Cus さんの実験と
同じ結果です。

ちゃいパパ 1999/10/13(水) 09:59:08
[[解決]]
B-Cusさん close(STDOUT); でうまくいきました!!
ありがとうございました!!
ぎんさん ありがとうございました!!
ふじさん 前回に引き続いて、ありがとうございました!!

[上に] [前に] [次に]