C言語のCGIを語りつつ普及するスレ
■ このスレッドは過去ログ倉庫に格納されています
C言語で書かれたCGIってなかなかイイもの見つかりませんよね。 前Cでかかれた掲示板を見かけたんですけど、なんかタグ用の処理が行われていないらしくて、グロ画像やエロ画像なんて 貼りたい放題でしたよ・・。わたしなんて<xmp>タグを貼りかけましたよ・・・ それはどうでもイイとしてKENTさんのCGIみたいに高機能で手軽なCGIのC言語版みたいなのがあったらなぁなんて思ったことありませんか? このスレではそんなCGIについて語って、CでCGIの考えを普及していきたいです。 module系はApacheに直接組み込むので、レスポンスは良いがセキュリティの観点から考えると極力避けたい。 速度やサーバ負荷の観点から、ノーマルなCGIも極力避けたい。 性能第一、開発効率第二で考えた場合は、 FastCGI + C が良いが、開発効率を考えると SpeedyCGI + Perl も捨てがたい。 開発効率第一、性能第二、セキュリティはあまり考えない場合は、 mod_php もあり。 開発効率も良く、楽しむなら、 FastCGI + Python 、 FastCGI + Ruby で決まり。(私は FastCGI + C で楽しめますが) ということで、 1、性能オタクの人にお勧め FastCGI + C 2、C言語しか知らない人にお勧め FastCGI + C 3、C言語が面倒でなかったり、面倒なことが嫌いではない人にお勧め FastCGI + C 4、C言語の達人にお勧め FastCGI + C 5、セキュリティを気にしながら質の高いサイト構築をしたい人にお勧め FastCGI + C 6、100%完璧なセキュアプログラムを作れる人にお勧め C -> apache module 7、組み込み系好きの人にお勧め C -> apache module 8、チャレンジャーにお勧め C -> apache module なのです。 あ、6〜8はmoduleだからCGIじゃないか。。。 私はURLデコードもエレメント抽出も全て自分でコードを書きました。 一つ一つの動作が理解できるのでC言語でのCGI作りはめちゃめちゃ面白かったです。 皆さん是非CでCGI(と言っても私のお勧めは FastCGI + C ですが)をしていきましょう! なお、上記ランキングは勝手な私見ですので、当てにはなりませんので、ご了承ください。 あ、Java忘れてました。 今後マシン性能が向上すればノーマルCGIもありになるとは思うが SSDなどストレージの性能が向上して、 メモリと同等レベルの速度がでるようになれば、 ノーマルCGIもありだと思います。 現在でもRAM Disk化すればそれは実現できます。 特にCPU負荷の大きい処理ではノーマルCGIでも C言語の選択は効果的です。 それでも、毎回ストレージにアクセスして、 プログラムを読み込み、プロセスを生成し、 実行後プロセスを破棄するノーマルCGIよりも、 プロセス生成済みの状態で、メモリに常駐して、 逐次再利用可能状態でプロセスの破棄が必要の ないFastCGIの方が相当レスポンスが良いし、 ストレージに全くアクセスせずに動作するし、 プロセス生成や破棄のCPU資源を必要としないので 色々な意味でサーバ負荷も激減するので、 より良い選択肢だと思います。 ノーマルCGI → FastCGI + C は無料で簡単 (日本のサイトでは情報が全くといっていい ほどないので私は苦労しましたが、手順自体 は簡単です)にできるチューニングですので、 MyServerを持っていて、C言語でCGIを作って いる人はやるべきだと思います。 PerlならFastCGIよりSpeedyCGIの方がより良い 選択肢だと思いますし、激重のRubyの場合は FastCGIは必須と言ってもいいでしょう。 moduleタイプはWebServer(apacheなどの プログラムの方のことです)内部で動作させる ので、より高速ですが、プログラムのバグが WebServer全体に影響しますので、危険度を考え れば、選択肢からはずした方が無難に思えます。 CGIタイプの方が間違いなく絶対に安全です。 そう考えると、FastCGI + C は現在考え得る サーバサイドプログラミングの中で最も高速 かつ安全な、まさに頂点に立つ方式だと考えます。 もちろん今の時代でC言語が使えるということは、 バッファオーバーフローの回避やコード部分に おけるアルゴリズムの最適化などができることが 最低限の必要条件だと思いますが。 そうでなければ、高速かつ安全とは言えませんので。 ということで、皆さん、C言語のCGIをどんどんやって普及させましょう! CGI + C より CGI + Perl / Python / Ruby の方が メモリ使用量や実効速度が速いというのは変。 あとプロセスを起動するたびに毎回HDDにアクセスとかありえない。 キャッシュに残ってるよ。 起動したら1行printして終わるだけのプログラムを、 CとPerlとbashスクリプトで作って、それぞれ起動してみたけど、 やはりPerlの方が時間がかかる。 $ time ./test.app real 0m0.001s user 0m0.000s sys 0m0.000s $ time ./test.pl real 0m0.002s user 0m0.000s sys 0m0.001s $ time ./test.sh real 0m0.001s user 0m0.000s sys 0m0.001s あと私も自分で一通りのAPI書いたけど、 そのCGIでtimeを測ってみても、↓の通り。 ソースコードで2.2MB、バイナリで350KBとかなり大物だけど、 それでもphpの実行バイナリ3Mとかと比べれば、軽いもんだね。 real 0m0.001s user 0m0.001s sys 0m0.000s >488さん >CGI + C より CGI + Perl / Python / Ruby の方がメモリ使用量や実効速度が速いというのは変。 その通りでした。 間違えて記載してしまいました。 実際は少なくとも CGI + Perl よりも全て上にランキングされます。 FastCGI + ? に関しては状況によるかと思いますが。 >あとプロセスを起動するたびに毎回HDDにアクセスとかありえない。 >キャッシュに残ってるよ。 OSやハードディスクの行うキャッシュに関しては、他の要因で追い出されることが考えられますので、無視して記載しました。 それまで入れてしまうと、CGI自体の動作やFastCGI自体の動作やSpeedyCGI自体の動作やmodule型自体の動作の説明ではなくなってしまいますので。 CGI→エグゼキュートやインタプリタ+スクリプトをストレージから読み込み実行 FastCGI→エグゼキュートやインタプリタ+スクリプトをプロセスとしてメモリに常駐させそれを実行 SpeedyCGI→バイトコードをプロセスとしてメモリに常駐させそれを実行 module型→エグゼキュートやインタプリタをWebServerのModuleとして組み込みメモリに常駐させ、スクリプトはストレージから読み込み実行 という風にそれぞれの機能を説明したかったのでそう記載しました。 >>490 なるほど。 私のCGIもapache moduleかFastCGIにしたいんだけど、 CGI専用にAPI開発したから、メモリ解放が手抜きすぎて無理だw 相当大きなものなのでしょうか? でも、それだけの実力者なら、時間は多少かかるものの簡単にできるのではと思います。 私の場合は、最初はプログラムの中でFastCGI仕様にしようとやっていたのですが修正が多すぎたので、main関数自体を別関数に変えてFastCGI仕様にしたらかなり楽に解決できました。 外部変数さえなければ、この技(というほどのものでもないですが)は有効だと思います。 apache moduleとして組み込むのは、一人で開発してますので、チェック機構(自分自身)に信頼がおけないのでやらないことにしました。 C言語で作る場合、FastCGIとmodule型は速度的にそれほど大差がない(処理速度は同じで、結果をWebServerプロセスに渡す渡し方の差しかない)ので、どちらでも良いのでしたらFastCGIを私はお勧めします。 スクリプト言語で組むなら、圧倒的にSpeedyCGIが抜きん出て、FastCGIのスクリプトを常駐させるアドバンテージとmodule型のスレッド通信のアドバンテージが相殺してあまり大差ないようですが。 いずれにしても、C言語でCGIが組めるのは(その根性があることこそが)大きなアドバンテージですので、お互いに頑張って良いものを作って普及させましょう! >>492 > 相当大きなものなのでしょうか? そだねー。 フォーム受け取り、XML-RPC、クッキー、 MD5、各種暗号復元化、base64、文字コード変換、絵文字、 いろいろなDBに対応したモデル、それのコントローラ、HTML埋込ビュー、 画像処理、セッション、ユーザ処理、画像認証、各種ユーティリティとかあるよ。 いくつかはUNIXでメジャーなAPIの呼び出しで実現してる。 もう設計からして、メモリ解放を前提としてないから、 もしやるとしたら、参照カウンタ+ガベージコレクションの実装かな。 >>493 素晴らしい財産の数々、驚きました。 確かに、これら全てを改変するというのは重労働ですね。 でも、それ以前にこれらを作ってきたことが、とてつもない重労働です。 私には、高い品質で世に(無償)提供したいものがありますので、いくつかのものは作りましたが、かなり多くのそういった財産を作っていかないといけません。 今まで、492さんがやってこられた重労働です。 それをやることに比べたら、一つ一つのコードのメモリ開放型への変更は、基本的にはオブジェクト指向でないC言語で、これまでやってきた492さんにとっては、克服できるのではないでしょうか。 module型やFastCGI用にするとなると、確かにそれ専用で設計した方が良いものが結構ありますので、この際せっかくですので、一括でドン!ではなく、後世に残る財産と思ってチマチマやってみてはいかがでしょうか? これだけできる人ならきっとすぐにできると思います。 私も始めた当初は、スクリプト言語で同じものを作る100倍以上の時間がかかっていましたが、今では2倍程度の時間しかかかりません。 せっかくのC言語でCGIですので、より高い品質のものを期待しています。 ・・・というか、492さんは全盛期のYahoo!にでも勤めてた(る?)のでしょうか??? >>494 私もこのAPIをもうちょい作り込んで、オープンソースででも公開したいんですが、 すでにいくつかの大手サイトで使っちゃってるので、 ソース公開してセキュリティホールが見つかったら怖いので、公開に踏み切れないw > ・・・というか、492さんは全盛期のYahoo!にでも勤めてた(る?)のでしょうか??? ずっとフリーで活動してますよ。 でも最近は仕事が激減して、暇を持てあまし中 orz CGIをC言語で書いているので、FastCGI + C の組み合わせにも興味あるけど、いまいち仕組みが 理解できなくて移行をためらっているので、もし良ければ質問に答えてもらえるとありがたいです。 CGIをFastCGIにすると、プロセスがメモリに常駐してFCGI_Acceptのループでリクエスト待ちになる みたいだけど、このとき複数のリクエストが同時に来たらどう対応されるの? 1. 一つのFastCGIのプロセスで順番に処理される 2. FastCGIのプロセスが新たに立ち上げられて、並行して処理される "1" ならアップローダーみたいな処理に時間のかかるものにはFastCGIは向かないって認識でいいのかな? (そもそも処理に時間がかかるなら起動コストの影響は少ないからノーマルCGIでいいのだろうけど) "2" ならせっかく常駐するのだから、データの内容をメモリにキャッシュして高速化しようとかすると、 複数立ち上げられたときにメモリを大量に消費しちゃうのでやらないほうがいいのかな? 試してみればいいのだろうけど、FastCGIに興味はあるけど今のところはC言語CGIだけでもCPU負荷で 困ることはなかったので、環境構築するところまでは踏み切れずにいました(^^; fastcgi は、基本的にはリクエストが来たら余っているプロセスがあればそれを使い、 なければ立ち上げるってだけ。 プロセスの生死自体は親が握っていて、同じインスタンスが同時に動くことがある ってのを覚えておけば、データをメモリにおいて使いまわすことは可能。 っていうかLinuxとかのOS標準のdevパッケージを使うなら、Hello, worldなcgi自体は 環境構築含めて15分もあれば出来るので、めんどくさがらず試せばよろしい。 >>495 これだけの実力者が暇を持て余しているとは、世の中狂っています。 これだけの実力者なら凡人がRubyで3000ステップの素晴らしいプログラムを作る時間で、10000ステップの同等の機能の素晴らしいプログラムを作るでしょうに。 早く、プログラマのフリーエージェント的な制度が確率すると良いと思います。 力のある人が、それなりの報酬を得られることは必要です。 それがなければ、努力もせずダラダラとIT業界に執着する人が増えるばかりです。 オープンソース化できるのなら是非してもらいたいです! それこそC言語でCGIの普及になります。 > ソース公開してセキュリティホールが見つかったら怖いので、公開に踏み切れないw だからこそオープンソースで良いのではないでしょうか? 一人の力には限界がある。 だからこそ、みんなの目で見てもし穴があるのなら、みんなで埋めていけば良いのだと思います。 完璧なものを公開して、威張るためのものがオープンソースではないと思います。 >>496 私が自分自身で言っていることと相反するようですが、495さんもおっしゃってたように、実動作では通常のCGIでも、キャッシュ化されますのでかなり高速です。 C言語の場合、処理自体が早いですから。 理論的に考えるとかなりの差ですが、実動作で考えると多くの場合FastCGIと通常のCGIの差は、「プロセスの生成」と「プロセスの廃棄」の時間になるかと思われます。 それと、昨日事情があって、Rubyの全コード見てみましたが、、、 素晴らしいプログラムで、感想は色々ありますが、とにかく長いですねぇ。。。 C言語のソースだけで、30ファイルくらいありますから、普通に流しで見るだけで4時間くらいかかってしまいました。 あのプログラムがインタプリタとして、スクリプトを読み込み処理することを考えると、遅いのが良く理解できます。 どれだけでかいWebアプリケーションをC言語で作ったとしても、あれほどでかくはなり難いので、間違いなくC言語で作ったWebアプリケーションは高速でメモリも食いません。 そう考えると、C言語のCGIだけで困っていないのなら、それでも良いかと思います。 ただ、多少の苦労で、無料で簡単に高速化できることは間違いないですし、多少のスキルアップにもなるかとも思いますので、是非一歩を踏み出して欲しいと思います。 RailsもRackをデフォルトとして一生懸命「単純化」や「高速化」を目指しています。 それよりも高いレベルのものが手の届くところにあるのですから、掴んじゃいましょう! 「手間がかかっても、面倒くさがらず、納得のいくアルゴリズムを完成させる」 「少しでも可能性があるのなら、より素晴らしいものを作るために努力を惜しまない」 それがC言語技術者だと思います。 色々相性など言われていますが、少なくとも私はApache & mod_fastcgiでとても安定動作しています。 やってみてダメなら戻せば良いのではないでしょうか? で、仕組みに関して私のわかるレベルで、解説ページを作ってみました。 急いで作ったので、おかしいかもしれません。 間違いがあれば、ご指摘ください。 ttp://www.dreamhope.net/soliloquies/webtec/ >>497-499 ありがとうございます。おかげでFastCGIを使ったときのイメージが理解できました。 FastCGIは興味があったけど、試してみるのが面倒というよりは、試してみるとのめり込んでしまいそうで 目の前にあるやらないといけないことをおろそかにできない状況だったので試せなかったのです。 元々はアセンブラでプログラムを組むのが趣味だったような人間ですので、手間よりも高速化が好きですから 今後は少しずつFastCGIも利用していきたいと思います。 >>500 高速化にこだわるなら、自分でアプリケーションサーバ書くのがいいのでは Apache臭はするけど、libaprなんかを使えばOSポータブルなdl()とかスレッドとか メモリプールとか基本データ構造とか入っててお得ですよ。 ま、それなりにデカいけどね。 この掲示板に出現する人は「C言語でCGI」をいかに、、、というのが目的ですし、 CGI部分を作るだけでも創造を絶する時間がかかりますので、アプリケーションサーバから作り始めるのは大変です。 今は情報が出回っていますので、作るに無理なことはないとは思いますが、一人で仕事外の時間利用だけで考えると、私ですと5年以上はかかりそうです。 Webアプリ一つ作るのにそれは効率的ではありません。 それにlibaprは、別にWebアプリケーションが高速になるものでもありません。 遅くなる可能性はあるけれど、作るときに便利で楽になるAPIだと思います。 C++技術者でない純粋なC言語技術者は、あまり使わないAPIだと思います。 使わざるを得ないAPI以外は、基本的に存在を知らなければすぐに自作してしまいますので。 「C言語が使える」ということは、別段便利なAPIを使う必要がないということでもあります。 libaprでメモリプールしなくとも、必要な分だけスレッドを立てて、mallocやcallocだけでしっかりメモリ管理できるということでもあります。(時に失敗しますが) おまけにlibaprのメモリプールは確保した領域をシステムに対して返却しないと記載されていましたので、逆にかなりコントロールしにくいAPIな気もします。 それだけの手間(時間)をかけ、なおかつメモリ周りも適当な設計で良いのなら、普通にC言語でApache module型Webアプリケーションでも組んだ方が楽で高速で良いのではないでしょうか? 作る際の効率が問題なら、そもそもwebアプリでCは選択しちゃダメ。 5年って、アナタたぶん作ったことないから死ぬほど安全に見積もってるよね? アプリケーションサーバって、そこまで作るの大変じゃないよ。やることは基本的に待つだけだし。 実際は余暇を二週間位でも最初のプロトタイプ位はできるんじゃ... まぁ、既存の適当にかかれたCGIをスレッド対応にするのは骨がおれると思うけど。 libaprのメモリプールの返却云々については、apr_pool_create の第二引数参照。 作業とか、ループとかにサブプールを作って、必要なメモリはそこから確保して、 終わったらサブプールだけ開放するって感じで。 でも、確かにCGIじゃないのでもうやめます。 fastcgiもCGIじゃないのではって気するけど... C言語が向いてるのは、開発費が多少増えたとしても、 サーバ台数が抑えられるから、トータルコストが安くて済むような案件だね。 検索サーバとか、2chとか、アクセス数が多いサイトとかね。 >>503 はい、もちろん作ったことはありません。 それに、今までのところでは作る必要性も感じたことはありません。 私がC言語で既存のAPIを利用せずにアプリケーションサーバを作ることを考えると、、、 FastCGIのようにアプリケーションサーバ(これはハードのことです)側にある複数のTCPクライアントCGIと通信をこなしながら処理を進めることや、 アプリケーション側に、どのようにどのくらいのメモリを与えるのかなどを考えると、 できるだけ汎用的なものにしようとすれば、TCP先で利用できるlibaprのようなAPIを自分で作らないといけないし、、、 というような感じで、503さんとは少し論点がずれていたようです。 すみません。 だた、やっぱり基本的な考え方としてはFastCGIは (Client → WebServer → FastCGI → CGI → FastCGI → WebServer → Client) という形態ですので、アプリケーションサーバもFastCGIとほぼ同じで、 (Client → WebServer → AppServer → App → AppServer → WebServer → Client) という形態になり、module型 (Client → WebServer(module型App) → Client) の方が構成がかなり単純ですので、C言語で作ったCGIやAppの反応はかなり高速だと思います。 それに、やっぱりmodule型のC言語Appを一つ作る方が、 アプリケーションサーバとクライアントアプリケーションの両方を作るよりも遥かに楽だと思います。 それ以上に、FastCGIであれば、 FastCGI用C言語CGIを一つ作れば済みますので、労力は激減します。 ただ、やっぱりアプリケーションサーバはもとよりmocule型AppもCGIではありませんね。 あと、FastCGIはCGIプログラムをメモリ上に常駐させるのかさせないのかという違いで、基本的な仕組みはCGIと同じと考えて良いと思います。 Content-type: text/html のtextをtestと打って 2時間もプログラム自体が丸ごと落ちてくる現象に悩まされた 鬱だ CでCGIってかウェブサーバ作りました。 ダウンロードサーバには結構いいです。 公開しよと思うんですがいいところはありますか? CGIというか、必要な所にソース書けばいくらでも Cで拡張できます。 最初にPerlからCにしてみたときの動作の速さは衝撃 惚れる DoS攻撃かと思うほどのアクセスかけてやってもC先生は華麗にさばく しかしまあ、スピードは慣れる 開発はPerlなら普通にある、デコードとか自分でひいこら書くのがめんどくさい 特にヒアドキュメントと連想記憶は欲しかったな 連想記憶はなんとかつくったけど ヒアドキュメントないからPrintfの嵐になる C++でもいいのかも知れんが なんか道具の大掛かりさに比べてやってる事が間違ってる感じは否めない それにCのほうがやっぱ早いしメモリも少しで良い 費用対効果で言うとCに比べてちょっとだけ苦労が減る分の物が手に入るとは思えない ヒアドキュメントなんか止めろよ printfはもってのほか 普通にテンプレートエンジン使うか作るかしろや ClearSilverとかあるだろ 言いたいことはわかるけどPerlやPHPから呼び出してもClearSilverが早いのはCでできてるからであって Cから利用するなら汎用的なテンプレートエンジン使うより、自分のサイトに特化したページ出力するのみなら 自分で書いた短いコードのほうが可読性も高いしバイナリも小さいし、ぜんぜん速いよ(仕組みはだいぶ真似さしてもらったけど) もちろん規模にもよるから いちいちそんなコード書いてられないほどサイトが巨大、複雑化したら考えるけど ヒアドキュメントはつかってないよCだから マクロでそれっぽいことはしてるけど それとさ悪口ではなく純粋に興味があって聞きたいんだけど >printfはもってのほか >テンプレートエンジン使うか作るかしろ 上でも言ったようにテンプレートエンジン的なものは作ってるけど でもprintfなしでどうしろと? ぜんぶ一度メモリに入れてputs ? そして使うなという理由は何? ClearSilverだってprintfとかsprintfとか中できっと使われてると思うんだが さすがWebProg板とはいえ、c言語のスレは住人のレベルがちがうな 最近、C言語でオラクルを読み書きできるシェアウェアを見つけたよん! 30日間は只なので試してみたら、さくさく動いた。 アパッチの設定も簡単だった。でも、説明がアバウトすぎるかな! ろじねこさーばーという名前だった。 今までの苦労は、一体なんだったんだろう。 普段はきちんと動作するのに-staticでコンパイルするとInternal Server Errorが出る不思議 C言語でCGI書くとPHPより負荷減るの? PHPだとなんかモジュールがどうとかでCGIより負荷が少ないって聞いたんだけど PHP でやるような普通の処理なら、C CGI では遅くなるだけ。 **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** http://sky.geocities.jp/ttl_ttl_ttl_pic/ NASMでC言語を作る NASMで高度な設計書類とNASMの簡単な利用方法のサイトです C言語のHEADの作り方 DLLファイルの作り方が書いてあります **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** **************************************************************** C言語でPostgreSQLのDBを操作出来るフリーウェアをつくりました。 CGIで操作します。コード生成機能をいれたのでゴタゴタしてますがα版になりました。 使い方少々難しいですがいかがですか? http://sourceforge.jp/projects/cwlk/ こうやってC/C++でCGIを書き続けて・・・・ 徐々にWEB フレームワークになっていき・・・ 可搬性を考慮してインタプリタにしていき・・・ 結果スクリプト言語に至る・・・と。 まさに車輪の開発。アホらし FastCgiに興味があるので質問をさせていただきます。 例えばcgiのようにアクセスごとにphpやcなどが起動する仕組みから いったん起動させておいて常駐させ、 リクエストごとに処理をさせる為の具体的なphp,c側の実装方法について 詳しい方いらっしゃいますか? >>499 ttp://www.dreamhope.net/soliloquies/webtec/ ここの住人だったのか。すげー面白い記事でした。 当日商品を出しました 4-7日到着します。 よろしくお願いします 店長:吉田 杏子 0870 http://xua.me/dSB ちょくちょく時間が有るときにC言語でHTTPD込みの掲示板ソフト 作り込んでるけど、HTTPプロトコルが面倒臭過ぎて嫌になる。 ☆ 日本の核武装は早急に必須ですわ。☆ 総務省の『憲法改正国民投票法』、でググってみてください。 日本国民の皆様方、2016年7月の『第24回 参議院選挙』で、日本人の悲願である 改憲の成就が決まります。皆様方、必ず投票に自ら足を運んでください。お願い致します。 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 KPV9ON1SVO ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる