![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
■質問
CGIで内部処理を待たずにレスポンスを返す方法について教示願います。
(関連サイトを調べていて、近しいものはあったのですが、なかなか今回の問題の原因と対処に結びつく有効な手がかりがない、苦慮しています。)
■詳細
<動作環境>
(1)画面(Java)→(2)Web(Apache)HTTPリクエスト→(3)CGI(C言語)
(3)→(2)を介して(1)へHTTPレスポンスを送信
この環境下で、(3)の中で(3)’処理((2)へのレスポンスとは非同期で
別処理(DBへ登録する処理)言語:cshをCの中からシステムコール。
cshの中でperl処理をキックし、DB更新)を今回追加しました。
(3)’を待たずに(1)へのHTTPレスポンスを返却したいのですが、
サーバログ((1)、(2))をみると、返却のタイムスタンプを見ると、
(3)’が完了した後に返却されているようです。
方式的に(3)の中でfolkを使用し、子プロセス化することで
親は子の処理((3)’)を待たずに(2)にレスポンスを返却可能とみておりましたが、そもそもCGI(C言語)ではできないものなのでしょうか?
→C(親処理)の中にデバックを仕掛けたところ、親の終了後に子が動いているように見えています。
■ソース(概要)※詳細(原本抜粋)が必要な場合は申しつけください。
IF文で定義
(1)forkで子の場合、
execlでcshを実行(cshには親でもらった引数を設定)
(2)親の場合、
デバックログファイルをクローズし、処理終了。
■補足(その他気になっている点)
・上記ソースでは、(1)の中では、親で使うログファイル出力
のcloseを行わず、処理終了していますが、問題ないか?
・同(2)のとき、perlCGIでは、close(stdout);を明示しないと
HTTPレスポンスが返却されない(子の終了を待ってしまう)
旨、サイトの情報に記載がありましたが、C CGIでも同様に
何かしらの明示をしないと、待たされるのか?
以上です。
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;
}
ありがとうございました。
私の開発環境ではC言語でCGIを作成しています。
Cの場合、stdoutのクローズはfclose();になりますが、当該命令を
追加することで、レスポンスを返すことができました。
★やりたいことが実現できました。ありがとうございます!
CGIでは、明示的にクローズを行うことでレスポンスを返せる事がわかりました。(まったくの初心者ですみません)
※因みに今まではHTTPレスポンスのBODYをSTDOUTに書き込んだ後、
特に後続処理はなかったため、苦慮しました。
(forkなどの使用検討も行っていました。)
以上です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- 消費者問題・詐欺 駐車場調べ隊というサイトで、会員登録してましたが 無料期間で退会するためサイトで申し込みしたところ 2 2023/06/03 23:22
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の行政法についての質問になります。 行政不服審査法についての質問になります。 ◆質問事 1 2023/07/24 20:13
- 弁護士・行政書士・司法書士・社会保険労務士 行政不服審査請求したところ、次ぎの答えが返ってきました。 1審査請求で審査会の結論 「費用返還決定処 4 2022/04/25 20:30
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
FFTの結果ついて
-
EXCEL VBA マクロ 実行する度に...
-
メルカリのメルカードで買い物...
-
NULLを含むフィールド値の条件分岐
-
【Excel】特定の文字を含むセル...
-
findは動くがfindnextがマクロ...
-
VBA Call BeforeDoubleClick(By...
-
条件付きコンパイル: #IF 1 Th...
-
FortranのGO TO文について。
-
CGIで内部処理を待たずにレ...
-
DoEventsがやはり分からない
-
1〜100の中で if(2の倍数) else...
-
Loadイベント中にほかのイベン...
-
月度は何て読みますか?
-
Select Case文でこのようなこと...
-
VBA ユーザーフォームにしたい
-
VBの質問#if 0 then ってどう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
DoEventsがやはり分からない
-
switch の範囲指定
-
メルカリのメルカードで買い物...
-
【Excel】特定の文字を含むセル...
-
VBの質問#if 0 then ってどう...
-
VBAでCOPYを繰り返すと、処理が...
-
EXCEL VBA マクロ 実行する度に...
-
findは動くがfindnextがマクロ...
-
インタラクティブの反対語は?
-
UMLでの例外処理
-
リョウ・・・量?料?
-
Do~Loopした回数をカウントしたい
-
セックスレスの既婚女性は自慰...
-
月度は何て読みますか?
-
セルの値が0はクリアするマクロ
-
Loadイベント中にほかのイベン...
-
FFTの結果ついて
おすすめ情報