C言語のCGIを語りつつ普及するスレ
■ このスレッドは過去ログ倉庫に格納されています
C言語で書かれたCGIってなかなかイイもの見つかりませんよね。 前Cでかかれた掲示板を見かけたんですけど、なんかタグ用の処理が行われていないらしくて、グロ画像やエロ画像なんて 貼りたい放題でしたよ・・。わたしなんて<xmp>タグを貼りかけましたよ・・・ それはどうでもイイとしてKENTさんのCGIみたいに高機能で手軽なCGIのC言語版みたいなのがあったらなぁなんて思ったことありませんか? このスレではそんなCGIについて語って、CでCGIの考えを普及していきたいです。 >>389 dyaregexp.hはboostより軽いちゅうわな。 ttp://hp.vector.co.jp/authors/VA028375/junkbox/dyaregexp.html っていうかC++でCGI作るならこれが基本じゃないの? http://www.cgicc.org/ あゃしぃ人を発見 ttp://labo.cherrybooks.net/ >>401 あのね、それ皆、書こうと思って遠慮してたんだけど・・・ お詫びにネタ振れよ。 >>402 gomen. ima, server karadakara, nihonngo nyuuryoku dekinai... サーバーに日本語入力入れてしまいました。 いいのかな… それよりDistcc入れて分散コンパイルに……(^^;;; WinXPでコンパったCGIがFreeBSDで動きません >>410 つ[Perl] お前さん、Cはやめておけ >>412 WINアプリがUNIXで動かないのは知ってるんですけど、なんとかならないですかね… クロスコンパイラは都市伝説、PCはPen200、64MBのノートだからUNIX系OSはボツ… Pentium200 64MBって、ちょっと前までは「PC-UNIXで再活用」の代表みたいなスペックだけど。 GUIは苦しいかもしれないけどね。 >クロスコンパイラは都市伝説 藻前はPerlでも使っとけ Cを昔から使ってたので最近PERLの掲示板なんかを自作しようと 環境は自鯖仕様でWin2K+Apache2+VisualC++7 GUIならではの開発環境でデバッグが簡単になる方法ってあるんですかね? 自分はVC6使ってたのでVC7の.netによる恩恵がよるわかりません;; 実行ファイルをCGIとして動かしてVCのデバッグトレース機能なんてできます? 用は実行ファイルの出力先にttp://hoge.com/abc.exeというのをGUIでデバックとか・・ UNIXは知らんのですがWinsockを利用して細かいことしようとすると 画面出力で print "ENV= なんてしてるもので作業効率最悪。 どっちかとVCスレの質問かもしれませんがすまそ・・ あと上げてすんま孫 C言語ってカックいー? つおい? おにぎりの具で言うと何? >>422 カックイーかどうかはしらないけど おにぎりの具で言うとうめぼしにマヨネーズって感じじゃない? CでCGIはBoF対策とか糞めんどくさそうでアフォっぽいけど、 C++でCGIはアリかもね たぶん、デザインパターンの本のこと じゃなくて、buffer overflowだと思う。 なるほど。 でも、Cでもバッファオーバーフロー対策なんて面倒という程大層なものじゃないが… 俺もそう思う。 逆に、「C++だからバッファオーバーフローの心配はあまりない」 等と言う人の作ったものの方が、よっぽど危険だよ。 このスレのおかげでふんぎりがついてCで画像掲示板作ってみたよ。 やっぱり慣れた言語が一番楽チンだね。組むのもデバッグも。 こんなスレあったんだ・・・。 俺はとある企業で5年ほど、CのCGI開発をしていたよ。 某陸√系のサイトはほとんどがCのCGIで動いてるし。 相当無理なことやってるけど、相当無理ができることも事実だったりする。 何言語で書こうがCGIである限りはCGIで出来る事しかできない ファイルIOを発生させる処理でもperlとかわんないのかな ディレクトリ一覧をサブディレクトリまで 取得して、htmlタグを付与して出力するとか考えとるんですが。 perlだとおそいorz そんなもんページ表示させるたびにやらせたら遅いに決まってる。 キャッシュくらいしろ。 すさまじく書き込みが少ないスレだなー。 かれこれ10年ぐらいCでWebアプリの開発やってる。 いろんなライブラリを開発してたら、ソースが2MBにもなってしまった。 このライブラリだけでCGIに必要な機能はほぼ提供できるところまで来た。 PHPやPerlと変わらないレベルで開発できる。 このライブラリを公開したら面白いことになりそうだけど、 企業秘密満載だから、さすがに無理か。 いいねぇ。 >>企業秘密満載だから、さすがに無理か。 CPANとかある方がCからみたら異質なんだろうな。 一からライブラリ作るのは面倒だからAPRでもつかってみるかな。 みんなヲレcgiライブラリの再生産遣ってそうだよな。 そろそろ基本的な所だけでも共有しないか? それなら、まずは442のライブラリから共有するとしようか。 基本的っつーとどのヘン? 昔のヤツをひっくり返して見つかったらアップしてみる。 普及が目的なら 基本的なライブラリの共有と並行して、 どうすればC言語でcgiが書けるのかという基本の解説がいるね。 hello worldのC言語cgi版みたいなの。 printbody("Hello World!"); だけで、 <HTML> <BODY> Hello World! </BODY> </HTML> ぐらいは、生成してくれるとかさ。 >>446 それ必要か・・・? templateエンジンのが良くね? テンプレートエンジンってどこにあるの? stdio.hには無かった。 CでMySQLやらPostgreSQLに接続するにはどうしたらいいんだろ? TCP/IPの通信部分から書かなきゃダメかなぁ? Cならmysqlにライブラリ付属してますが? ドキュメントぐらい読んだら? ふぇどら3でコンパイルしたCGIが You don't have permission to access /index.cgi on this server. っていわれてうごかないんだ。 httpd.confに Options ExecCGI AddType application/x-httpd-cgi .cgi って記述してるし、パーミッションも755になってるのにどうして? >>454 SELinuxとかどうなってる? 使ってないの前提として、パーミッションてどこのパーミッションだ? ディレクトリの方はどうなってる? 所有権は? 迷ったら777試せ SELinuxも無効にしたんだけどダメだ・・・ Windowsのxampp上では動くのに・・・ 777もやってみたけどダメだった 所有権は777だから別に違っても大丈夫なはず ディレクトリは見てなかったけど同ディレクトリ以下の phpは走るし大丈夫なはずじゃ・・・あ 帰ったら試したいことが出来ました。 まだ解決してないけど>>455 さんまりがとう('∀`) cgiつーかC言語のウェブアプリケーションって無いよね。 ぐぐったらウェブオブジェクト4.5とか出て来たけど、これはマカ専用? >>457 使ってる企業は多いだろうけど、 目的の一つとしてソースをクライアントに見られずに済む というのがあるだろうから、どこも非公開なんだと思う。 >>457 WebObjects4.5はWinNT系でも動くけど、ObjCはクセがあるから習得には個人差があるかも。 CGI作っている途中だが、何かと面倒だな。 Cだと たしかに作業量は多いね。 スクリプト系の方がいいのかな。 age 最近、Cで書かれた通販システムを見かけたよ。 >>772 $body = preg_replace('/([0-9]+)/', $hoge_array[\\1], $body); echo $body; で「¥」が使えませんってエラーがでるけど、エラーをひょうじしなければ目的の結果は得られる…… どうやってエラーださないようにするか… #include <stdio.h> int main() { printf("Content-Type: text/html\n\n"); printf("<HTML><BODY>\n"); printf("保守\n"); printf("</BODY></HTML>\n"); return 0; } >>467 かなり大変だという覚悟があるならどうぞ。 自作ライブラリを既に持ってる人じゃないと、 一般的な用途ではメリットは少ないかも。 ありがとさんです 大変そうだけど 楽しそうだからやってみようかな しかしCの人は優しい人が多い気がする 俺ブログ書くほどボキャブラリー富んでないからCGI無しのサイトなんて 考えられね; おはよう。今日からここで自習していい?いいよね。 とりあえず出力なんだけど、printfとかのf系出力は、stdout に出せばうまくいくね。でもwrite(fileno(stdout),...はダメみたいだな。 とりあえず今日まで勉強したまとめ。 標準系 content-typeとかのmime header出力\n\n 本文 return 0; 異常系 printf( "status: 番号\n\n"); 本文 exit(0); 続き。 エラーの出し方。 printf( "status: 404....\n\n"); >>471 じゃー、私も一つ。 セグメンテーション違反などでCGIが落ちて、 どこで落ちてるか分からない時は、 デバッグ用の表示と fflush(stdout); をちょくちょく実行すると良い。 >>473 なるほどですね。 fflushall()ってもうないんでしたっけ? ・パース文字列の切り分け。これが簡単かも。 first_string = strtok(string,"=&"); second_string = strtok(NULL,"=&"); .... リターンがNULLまで、繰り返しするのが良いかも。 ・デバッグ用マイクロ秒表示 make_datetime_string(date_and_time); gettimeofday(&tv,NULL); snprintf((char*)str, sizeof(replace_date_and_time), "\n%s.%06d[%d] ", date_and_time, (int)tv.tv_usec, getpid() ); 結局mod_xsendfile使っちゃいましたが、sendfile apiって早そうですねー。 これならCGIでもパフォーマンスあがるかも。 計算量や文字列処理の非常に多いプログラムの速い順(2度目以降のアクセス) C -> apache module FastCGI + C CGI + C SpeedyCGI + Perl mod_perl FastCGI + Perl CGI + Perl mod_python mod_php FastCGI + Python CGI + Python mod_ruby FastCGI + Ruby CGI + Ruby 特徴として言語自体の速度差が順位を決める 計算量や文字列処理の割と多いプログラムの速い順(2度目以降のアクセス) C -> apache module FastCGI + C SpeedyCGI + Perl mod_perl FastCGI + Perl mod_python mod_php mod_ruby FastCGI + Python FastCGI + Ruby CGI + Perl CGI + C CGI + Python CGI + Ruby 特徴として、ノーマルなCGIは極端に遅く、Perlの洗練された完成度の高さが伺える 計算量や文字列処理の少ないプログラムの速い順(2度目以降のアクセス) C -> apache module FastCGI + C SpeedyCGI + Perl mod_perl mod_php FastCGI + Perl mod_python mod_ruby FastCGI + Python FastCGI + Ruby CGI + Perl CGI + Python CGI + Ruby CGI + C 特徴として、動作の前段階のメモリ上で動作可能な状態になるまでの速度差(レスポンスの良さ)が順位を決める 使用メモリの少ない順 C -> apache module FastCGI + C SpeedyCGI + Perl mod_php mod_perl mod_python mod_ruby FastCGI + Perl FastCGI + Python FastCGI + Ruby CGI + Perl CGI + Python CGI + Ruby CGI + C 特徴として、提供方法にかなり影響される サーバの環境構築の速い順 C -> apache module (何も手間なし) mod_php (apacheに標準で付いていることが多い) CGI + Perl (apacheの設定ファイル変更) CGI + C (apacheの設定ファイル変更) CGI + Python (Linuxインストールで標準で付いていることがある&apache設定) CGI + Ruby (自分でインストール&apache設定) mod_perl (自分でインストール&apache設定&モジュール起動) mod_python (自分でインストール&apache設定&モジュール起動) mod_ruby (自分でインストール&apache設定&モジュール起動) SpeedyCGI + Perl (自分でインストール&apache設定&モジュール起動) FastCGI + Perl (自分でインストール&apache設定&モジュール起動&コード宣言付加) FastCGI + Python (自分でインストール&apache設定&モジュール起動&コード宣言付加) FastCGI + Ruby (自分でインストール&apache設定&モジュール起動&コード宣言付加) FastCGI + C (自分でインストール&apache設定&モジュール起動&コード変更) プログラムを作る速度の速い順(難易度?)(初めてのプログラミング) mod_php (何も考えずHTML組み込みからすぐに始められる) mod_ruby (Rubyを知っていれば、すぐに始められる) CGI + Ruby (パーミッションとか知らないといけない) FastCGI + Ruby (宣言付加しないといけない) mod_python (Pythonを知っていれば、すぐに始められる) CGI + Python (パーミッションとか知らないといけない) FastCGI + Python (ド宣言付加しないといけない) CGI + Perl (パーミッションとか知らないといけない) SpeedyCGI + Perl (宣言付加しないといけない) FastCGI + Perl (宣言付加しないといけない) mod_perl (Perlを知っていても制約が多い) CGI + C (面倒) FastCGI + C (逐次動作可能プログラムにしないといけない) C -> apache module (モジュール化の手間がかかる) 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として組み込みメモリに常駐させ、スクリプトはストレージから読み込み実行 という風にそれぞれの機能を説明したかったのでそう記載しました。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる