- ベストアンサー
CGIで内部処理を待たずにレスポンスを返す方法
- CGIで内部処理を待たずにレスポンスを返す方法について解説します。CGI(C言語)の中で非同期処理を行い、親プロセスが子プロセスの処理を待たずにクライアントにレスポンスを返す方法があります。
- 具体的には、(3)の処理を非同期化するためにfork関数を使用し、子プロセスで別の処理を行う方法です。子プロセスで非同期処理を行うために、execl関数を使って別のプログラム(例:perl処理)を実行します。
- ただし、C CGIでは親プロセスが終了した後でも子プロセスが動作しているように見えることに注意する必要があります。さらに、親プロセスと子プロセス間でのファイルのクローズやHTTPレスポンスの明示など、注意点もあります。
- みんなの回答 (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; }
お礼
ありがとうございました。 私の開発環境ではC言語でCGIを作成しています。 Cの場合、stdoutのクローズはfclose();になりますが、当該命令を 追加することで、レスポンスを返すことができました。 ★やりたいことが実現できました。ありがとうございます! CGIでは、明示的にクローズを行うことでレスポンスを返せる事がわかりました。(まったくの初心者ですみません) ※因みに今まではHTTPレスポンスのBODYをSTDOUTに書き込んだ後、 特に後続処理はなかったため、苦慮しました。 (forkなどの使用検討も行っていました。) 以上です。