• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIで内部処理を待たずにレスポンスを返す方法)

CGIで内部処理を待たずにレスポンスを返す方法

このQ&Aのポイント
  • CGIで内部処理を待たずにレスポンスを返す方法について解説します。CGI(C言語)の中で非同期処理を行い、親プロセスが子プロセスの処理を待たずにクライアントにレスポンスを返す方法があります。
  • 具体的には、(3)の処理を非同期化するためにfork関数を使用し、子プロセスで別の処理を行う方法です。子プロセスで非同期処理を行うために、execl関数を使って別のプログラム(例:perl処理)を実行します。
  • ただし、C CGIでは親プロセスが終了した後でも子プロセスが動作しているように見えることに注意する必要があります。さらに、親プロセスと子プロセス間でのファイルのクローズやHTTPレスポンスの明示など、注意点もあります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

子プロセスがレスポンスを返して、親より先に死ぬようにしたほうがよいと思います。 また、レスポンスを返さないほうのプロセスは先にSTDOUTをcloseした方が良いでしょう。 以下perlですが、やることはほぼ同じだと思います。(半角スペースを全角にしてます。) #!/usr/bin/perl use strict; use warnings; use utf8; use CGI; use CGI::Carp qw(fatalsToBrowser); use CGI::Pretty; if ( my $pid = fork ) {   # Parent   # Close STDOUT   close STDOUT;   # Do heavy work   sleep 10;   my $file = '/tmp/tmp3.txt';   open my $fh, '>', $file or die "$!:$file";   print $fh "Hello CGI. I'm parent\n";   close $fh or die "$!:$file";   # Wait to finish child for safe   wait; } elsif ( defined $pid ) {   # Child   # HTTP Response   my $q = CGI->new();   print $q->header( -charset => 'UTF-8' );   print $q->start_html(     -lang => 'ja',     -title => ' T I T L E '   );   print $q->p("Hello CGI. I'm child");   print $q->end_html; }

aratani
質問者

お礼

ありがとうございました。 私の開発環境ではC言語でCGIを作成しています。 Cの場合、stdoutのクローズはfclose();になりますが、当該命令を 追加することで、レスポンスを返すことができました。 ★やりたいことが実現できました。ありがとうございます! CGIでは、明示的にクローズを行うことでレスポンスを返せる事がわかりました。(まったくの初心者ですみません)  ※因みに今まではHTTPレスポンスのBODYをSTDOUTに書き込んだ後、   特に後続処理はなかったため、苦慮しました。   (forkなどの使用検討も行っていました。) 以上です。

関連するQ&A

専門家に質問してみよう