C言語で動的に確保したメモリのCGIがKILLされたら

このQ&Aのポイント
  • C言語でCGIを製作している際に、動的に確保したメモリ内容を標準出力に表示している場合、閲覧者からの受信停止が起きた場合の処理方法を知りたいです。
  • APACHEのログを確認したところ、出力が最後まで行われず、30kbyte程度で収まっていることが分かりました。
  • OS側での処理方法が最善であれば良いですが、それについても教えていただきたいです。
回答を見る
  • ベストアンサー

CGIがKILLされたら、Cで動的に確保したメモリは?

C言語でCGIを製作していています。(環境:Linux + APACHE + gcc) malloc()などで動的に確保したメモリ内容を標準出力に表示している時に 出力先(閲覧者ですね)側から受信停止されたら、その後の処理はどうな るのでしょうか? その時の例外処理は、コンソールでのターミネイト処理と同じでいいので しょうか。 試しにAPACHEのログを見てみますと、出力は最後まで行われていないよ うです。本来そのCGIは120Kbyteの転送量が書き出されますが、受信停止 と思われる30kbyte程度で収まっています。 OS側でうまくやってくれれば、それにこしたことが無いのですが。 どうぞよろしくお願い致します。

  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • flame
  • ベストアンサー率100% (3/3)
回答No.1

 UN*X系のOS(Linuxもそう)で、webサーバがApacheであれば、ブラウザ側で中断されると、CGIで起こされたプロセスにはSIGTERMが送られます。SIGTERMを受け取ったプロセスのデフォルトの処理は「強制終了」で、使っていたリソース(メモリとか、ファイルハンドルとか)は、OSによってシステムに回収され、後始末されます。  もちろん、SIGTERMを受けるシグナルハンドラを定義して、自前で終了処理を行ってもかまいません。

kitcat
質問者

お礼

CGIの場合もFree()しなくても、大抵はOS側でやってくれるのですね。 ありがとうございました。

関連するQ&A

  • メモリの再確保について

    テキストファイルを読込む関数を作成しています。 まず最初にある程度の領域をmalloc()関数で確保し、 読み込む過程で領域が不足すると再割り当てを 行うようにしたいのですが、 エラーが出力されます。 ソース(エラー処理は省略)は次の通りです。 textdata = (char *) malloc (size * sizeof (char)); for (i = 0; !feof (stream); ) { character = fgetc (stream); textdata[i] = character; i++; if ((i % size) == 0) { temp = (char *) malloc (2 * size * sizeof (char)); memcpy (temp, textdata, size * sizeof (char)); free (textdata); textdata = temp; } } 出力されるエラーは次の通りです。 *** glibc detected *** ./lsm: malloc(): memory corruption (fast): 0x09a34198 *** (省略) アボートしました どなたか解決方法を御指導願います。

  • CGIプログラムの最後に?がついてします。

    CGIをC言語で書いております。起動時には、http://hoge/a.cgiとしております ます。この時には、URLにはhttp://hoge/a.cgiとなっているのですが、 そこから先に飛んで、<form method=GET action=a.cgi>で戻ると http://hoge/a.cgi? となります。 特に引数は必要ないのですが、なぜでしょうか? Solalis8.0+Apache+GCCです。

    • ベストアンサー
    • CGI
  • close(STDOUT)するとCGIが終了する。

    Windows2000+Apache2.2+ActivePerlでCGIを作っています。 CGIで時間のかかる処理を行いたいので、以下のような処理を行いました。 print "Content-type: ~ ~ブラウザに返す文字列を標準出力へ~ close(STDOUT); ~時間のかかる処理~ ところが、「時間のかかる処理」の部分は実行されず、どうやらSTDOUTをクローズしたことにより、 ApacheによってCGIが終了させられてしまうようです。 ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、Windowsでの実装になにか違いがあるのでしょうか? また、Windowsサーバーでこのようにブラウザに処理を戻しつつ、時間のかかる処理を行いたい場合にはどうすればよいのでしょうか?

    • ベストアンサー
    • CGI
  • C言語で作成したCGIにて「Internal Server Error」

    こんばんは。CGIについて質問させて下さい。 現象: C言語でCGIを作成し、ローカルで動作しているApacheで 動作確認をしようとしたところ、 「Internal Server Error」が出てしまいました。 質問: 上記の現象が起こったのですが、C言語でCGIを実行するには なにが足りないでしょうか? 環境: OS:WindowsXP Webサーバ:Apache 2.0.61 Cコンパイラ:gcc 3.4.4(cygwin) 状態: ○「http://localhost:8080/」にアクセスすると「あなたの予想に反して・・・」画面は見れます。 ○「http://localhost:8080/cgi-bin/test.cgi」にアクセスすると、「Internal Server Error」が表示されます。 ○httpd.confの設定値(デフォルトから修正した部分) ・ServerName 127.0.0.1:8080 ・<Directory "C:/Program Files/Apache Group/Apache2/cgi-bin">内 Options none → Options ExecCGI ・#AddHandler cgi-script .cgi → AddHandler cgi-script .cgi ○Apacheのerror.log ~[error] [client 127.0.0.1] Premature end of script headers: test.cgi ○test.cgiのコンパイル前ソース ---ここから #include <stdio.h> int main(void){  printf("Content-Type: text/html\n\n");  printf("<html><body>Hello, World!</body></html>");  return 0; } ---ここまで ○test.cgiはcygwinにて標準出力を確認済み。 ・・・ちなみにperlでCGIを作成すると表示されます。 (ActivePerlインストール済み) perl側のソース ---ここから #! c:/perl/bin/perl print "Content-Type: text/html\n\n"; print "<html><body>"; print "Hello, CGI!"; print "</body></html>" ---ここまで なにかおかしな点がございましたらご指摘をお願い致します。

    • ベストアンサー
    • CGI
  • POSTメソッドで処理を分岐させるとCGI.pmの動きがおかしくなります?

    いつもお世話になっています 複数のチェックボックスのデータを、取得しいので CGI.pmライブラリの利用を考えました、プログラムの流れとしてはボタンを押したら チェックを入れた項目だけをコンソールに出力させたいのですが、 POSTメソッドでmode及びsctionに変数をセットしてやり、 サーバーに投げてやり、その値により 処理を分岐させたいのですが(データ追加処理とデータ出力処理に振り分ける) 所が、CGI.pmライブラリを利用すると、処理が行われません因みに #use CGI; #$q = new CGI; としてコメントアウトすると、分岐処理が行えますが、当然チェックした項目の出力はできません どこかおかしな所が在りますでしょうか、宜しく御教授お願いいたします。 コードが長くなってしまったので、下記のサーバーにアップしてあります http://www.geocities.jp/linux_rh_penguin/cgi.txt 申し訳ございませんが一読、宜しくお願いいたします。

  • JavaScriptからCGIを読み出す方法

    お世話になっています。 今回、JavaScriptからCGIで読み出した文章を出力する方法についての質問があり、 投稿させて頂きました。 まず、CGIで、例えばa.logというファイルを読み出し、ブラウザに出力する処理を書きます。 a.logファイルは全て文字列です。 次にHTML側で、適当にaタグでリンクを張ります。 このリンクをクリックすると、そのCGIが読み出した文章を特定の場所に出力する、 という処理をしたいのですが、うまく出来ません。 探していると、インラインフレームを使えばいいとよく見かけるのですが、 その方法は取りたくないのです。(サイトのデザインの関係上) 試したソースは、JavaScriptでファンクションの定義をし、 実行されれば以下のようなソースを出力する、というものでした。 <script language="JavaScript" src="read.cgi"></script> 自分でも無理があるな、とは思ってますが、これ意外思いつかなかったもので・・・ 皆様のお知恵をお貸しください。 お願いします。

  • Ajax&CGI

    Ajax勉強中の者です。 勉強のために簡単なAjaxプログラムを作成しているのですが、早速上手くいかず困っているので質問させて頂きます。 ※ソース等は手元にないのであまり詳しい状況は説明できないかもしれませんが・・。 実現したいことはテキストボックスがあり、そこにIPアドレスを入力しボタンを押すとサーバへ入力した値を送信し、サーバ側では送信された値を受け取りいろいろ処理をした後にクライアントへレスポンスし、クライアントで表示する みたいなことをやりたいのですが(説明下手ですみません・・)。 サーバ側はCGI(Perl)で作成しており、処理は簡単に説明するとクライアントから受け取ったIPアドレスでPingを打ってその結果をクライアントへ返すみたいな感じなのですが、上手く動作せず困っています。 PerlではNet::Pingモジュールを使ってIPアドへPingを実行しています。エラーの内容ですがXMLHttpRequestのstatusは500(サーバー内部エラー)となっており、”エラーを特定できません”と表示されます。 使用しているWebサーバはApacheですがこれは自分がテスト用PC(Linux)へインストールしたもので、もしかしたらサーバ構築に問題があるのかなぁ~なんて不安にもなっています。 テキストボックスに入力したIPアドをサーバで受信し、ブラウザにAjaxで”入力されたアドレスは~です”と表示させたりは動作したのですが・・。 また、Apacheの設定で拡張子.plをCGIとして扱わないようにすると(httpd.confファイルのAddHandlerへ.plを追記しない)サーバの処理結果でなくソースが丸ごと表示されてしまい困っています・・。 ただ拡張子.plをCGIとして扱うと処理結果がレスポンスされます。 この現象についてもどなたか原因を説明して頂けると感謝です。 原因&解決方法など分かる方はぜひご教授ください。 よろしくお願い致します。

  • IISでCGIとしてのPerlが動かない

    Win2K ProにてIISでローカルサーバーでサーバーサイドスクリプトの勉強中です。 ASPは標準でついているので、PerlとPHPを組み込みました。 PHPは内部プロセス型ではなく、CGIバージョンですが、正常動作しました。 もちろんASPも。 それで問題なのですが、Perlがどうしても動きません。 PHPと同じように実行ファイルのパスや拡張子の設定はできているはずです。 しかし、いつまでたっても出力が出ず、2分くらいたってCGIタイムアウトとなってしまいます。 PerlにはActive PerlとCygwin付属のPerl両方試しましたが、タイムアウトです。 ファイルをコンソール上で実行してみましたが、Active PerlもCygwinのPerlも、期待通りの出力がなされています。 ちなみに、shファイルをCygwinのbashに関連付けて、実行させましたが、コンソール上での出力とはうらはらに、ブラウザ上ではやはりタイムアウトとなりました。 PerlのソースはいずれもほかのところのApacheでは動いているものです。 httpヘッダも正常です。 ソースの文字コードは英語のみ、EUC、改行コードcr+lf、lfのみなど、いろいろ試しましたがダメでした。 なにが原因なのでしょう。 IISを使っている方、アドバイスお願いします。

  • Apache2 - CGIで出力されたファイルの所有者を変更するには?

    Gentoo LinuxでApache2を動かしています。 Apache2の質問です。 UserDirで実行された(mod_userdirで処理される)CGIまたはPHPスクリプトが出力するファイル/ディレクトリの所有者を、リクエストされたユーザディレクトリのuid, gid へ自動的に変更する方法を教えてください。 レンタルサーバーではこのような動作を見掛けるし一般的だと思うのですが設定方法がわかりません。 よろしくお願いします。

  • CGIでファイルのダウンロードをさせたい

    ホームページでファイルのダウンロードをさせたいの ですが、セキュリティの関係もあって元ネタのファイル はURLで指定できるところにはありません。 そこで、C言語でCGIを作成し、Content-Type: text/plain\n\n などとし、CGI側でファイルをOPEN して吐き出させたところ、ブラウザー(IE5)では ダウンロード画面が表示されず。CGIが出力した内容が そのまま表示されてしまいます。CGIでの処理が足りない と思われますが、どうしたらCGIからブラウザーへダウンロードの指示を出すことができるのか教えて下さい。

    • 締切済み
    • CGI

専門家に質問してみよう