gcc
ぐへへへ。ワタシがデーモンである・・・(意味不明と言う訳でボクノスサーバーがデーモンになりました。デーモンになるときは、chdir("/")して、標準入出力を/dev/nullに繋いで、端末と切り離すと。chdir("/")しているので、起動引数が長くなります(ちとはま…
困ったぞ さて、fork後に子プロセスを呼ぶにはどうしたらいいのか・・・。コレが出来ないとこの先とっても辛いので調べます。マルチプロセス・プログラムのデバッグありました。さすがマニュアル!子プロセスに制御を移したいときは「set follow-fork-mode ch…
17章前半戦 いやぁ。やっとこの時がきました。httpサーバーのブラウザに表示!!socket→bind→listinでストリームに接続。acceptした瞬間、デバッガの動きが止まり、クライアントからのリクエストを待っています。firefoxでアクセスしてみます・・・。http://lo…
インストール GDBハンドブックで紹介されていたGDBのフロントエンドInsightをインストールしてみました。fedoraのパッケージに無かったので、ソースコンパイルでした。fedoraなんも入っててぇなぁ・・・。 試す % insight httpd ←いま作ってる奴メニューをの…
gccの警告オプション-Wallはいつも付けているのですが、-Wオプションは恐くて付けていなかった。gcc4では、-Wの代わりに-Wextraを付ける。Makefileに追加してみる。 CFLAGS=-Wall -Wextra makeすると・・・ request.c|223| warning: unused parameter ‘info’…
最近C言語なtanakaです。C言語なんて・・・今時・・・と思われるかもしれませんが、PerlもPHPもRubyもみんなC言語で作られてるんですよ!つまり、C言語を学ぶと・・・4つの言語を同時習得出来てしまう!!遠回りしたつもりで、実は近道かもしれないと思う訳。3…
C FAQ 17 printf()を呼び出しているところすべてに、いちいち(void)のキャストを付けているコードを見かけた。なぜこんなことをするのか。 FreeBSD lsのusageより。 void usage(void) { (void)fprintf(stderr, #ifdef COLORLS "usage: ls [-ABCFGHILPRSTUWZa…
ふぅ。やっと16章終了〜。telnet風にリクエストを送ると、ファイルを返せるようになりましたぁ〜 % ./httpd . GET httpd.c HTTP/1.0 HTTP/1.0 200 OK Date: Mon, 16 Apr 2007 15:45:16 GMT Server: httpd/1.0 Connection: close Content-Length: 517 Content…
fedoraパッケージで見付からなかったので、GNU cflowをソースコンパイルした。メモしておく事にする。 % wget http://ftp.gnu.org/gnu/cflow/cflow-latest.tar.bz2 % tar xvf cflow-latest.tar.gz % cd cflow-1.1 % ./configure % make % sudo make install …
FreeBSDのlsのソースを見たとき、おぉぉぉぉコレダ!と思った。やはり、GNUは相当見にくいので、FreeBSDのソースコードを入手する事にした。FreeBSDの場合、コアパッケージの中に基本ユーティリティも入っている事が判ったので、がが〜っと、CVSでダウンロー…
最近、黒い画面ばかり眺めているtanakaです。昨日から考えていた。「プログラマの考えていることをユーザーにわかりやすく説明するにはどうしたらいいか。」僕たちのアウトプットはどうしても文字になってしまう。黒い画面に、白いテクスト。叩き出された一…
continue ブレークポイントまたはwatchポイントまで実行 next ステップアウト(呼出先には飛ばない) step ステップイン(呼出先まで飛ぶ) 性質の違う3つのステップ実行を使い分けるのがポイント。
まだ16章で止まってます(遊びすぎそんな時は、やる気を出すためのワンライナ。 % wc -l *.[hc] Makefile 25 httpd.c 59 libs.c 7 libs.h 176 request.c 24 request.h 21 Makefile 312 total312行書いた!!まだ16章は長そう・・・。 追記 2007-04-12 C faqを見…
gdbの履歴制御はちょっと特殊。 M-pを押すと、:が出る。 検索したい文字を打ったらタブではなくエンターで決定する。 結論。動作がイマイチなので、C-r(インクリメンタルサーチ)を使った方がいい。 参考 Debugging with GDB - コマンドライン編集 - ヒストリ…
とうとうHTTPサーバー製作開始!!って過激にムズくなった・・・。リンクリスト、文字列処理、シグナル、mallocと苦手どころが満載!!やっぱりCで作るとやたらむじぃ。ちょいちょい実験を重ねながら進めているので進みはかなり遅いです。strchrによる文字列分解…
やっと、HTTPリクエストヘッダ解析になりました。やはりC言語での文字列処理は大変!!C言語にはsplitなどという便利な機能は備わっていないので、ポインタを一歩づつ進めながら、文字を解析、分解、連結リストの中にぶち込んでいきます。telnetと同じようにリ…
ソースコードを読むための技術で紹介されていた、GDBのフロントエンドDDDを使ってみました。DDD - Data Display Debugger - GNU Project - Free Software Foundation (FSF)使い方は、GDBに拡張命令を加えた感じ。メニューから選べるし、ソースクリックだけで…
なかなかメモリ確保に失敗することが無いので、こうしてみた。 p = malloc(INT_MAX); if (!p) { perror("malloc(3)"); exit(EXIT_FAILURE); } malloc(3): Cannot allocate memoryやった。何処までいけるかな
man編 セクション番号 2 システムコール 3 ライブラリ 0p POSIXヘッダ 0pが使える。 % man 0p sdtio.hこれでstdio.hの関数定義一覧が見れる。zshだと、セクション番号入れると補完が利くのでかなり便利。単語検索-Kと併用すれば・・・ % man 0p -K INT_MAX /…
lsコマンドのソース(FreeBSD版)|gihyo.jpより。 書籍『ふつうのLinuxプログラミング』の著者である青木峰郎氏が「lsのソースを読んでないのはプログラマとしてかなりまずいのではないでしょうか」と言及していました。 !!読もう。←まずい人とりあえず最新…
さて、いよいよ後半戦。第3部!!Linuxネットワークプログラミング!!まずは、daytimeクライアント。サーバーの時計が見れるらしい。っていきなりむじぃし・・・サンプルにヘッダ書いてないし・・・。仕方ないので、manを叩きまくり、Vimの補完で楽をしつつ、GD…
11章はメモリ、ハードウェア、コンパイルの説明。いつまで経っても、ポインタは苦手(汗驚いたのが、コレ。/proc/pid番号/mapsで、メモリの使用状況が判る。 % ps PID TTY TIME CMD 6224 pts/5 00:00:00 ps 31822 pts/5 00:00:16 zsh % cat /proc/31822/maps …
今回はls,mkdir,rmdir,ln,symlink...等ファイルシステム関連。全部やるとしんどいので、ls,mkdir,rmdirだけ作った。後はほぼ同じような感じ。「rm -r」面倒だなぁと思ったら、ファイルシステムとの絡みがあると。linuxの"何故"が見えてくる所がおもろい。で…
あぁ、昨日のforkがイマイチ掴めていない。なので、実験を重ねる。 printf("hoge\n"); pid = fork(); hogeは1度しか表示されない。つまり、 | printf("hoge\n"); | +--+ fork(); | | 親 子であることが、確認できた。最初から実行している訳では無い。あぁ・…
第9章はプログラムを書かない項なのですが、重要どころなので、Linuxのディレクトリを巡るツアーを慣行致します。 /bin ブートに必要な基本コマンドが入っていると。 見たことあるプログラムが多いけど、まだまだ試したことのないファイルが結構あります。気…
makeはタイムスタンプと依存関係を洗い出しコンパイルの必要のあるものだけ再コンパイルしてくれる。しかし・・・それが仇になることもよくある話・・・。例えば、makeとmake debugで、コンパイル条件を別けてコンパイルしたくなる。しかし、示しているター…
いよいよやってきました!!「grepコマンドを作る」!!自分で正規表現ライブラリなんか書いたら・・・いつまでかかるか・・・お手軽libcを使って書いていきます。前に作ったheadコマンドを修正してっと。make debug!! (gdb) r "[grep]{4,}" grep.c Starting pro…
以前にも使ったことのあるgdb。以前に使ったときはアセンブラのデバッグだったので、あまり有用性を感じなかった。今回はcのデバッグに使ったのが、かなり有効に使えることがわかった。メモっておく。 % gcc -Wall -g -o head head.c % gdb head (gdb) r -n …
今回はheadコマンドを作る。catとあまり変わらない感じですが、引数に-n 5, -n5 --lines 5 --lines5等を取れるようにします。普通に組んだら、ここだけで大変なんですが・・・getopt.hのgetopt_longという便利な関数を使って、解析しちゃってます。便利すぎ…
GNU catのソースよんでま〜す。そんなわけで、safe_read.c safe_write.cからのハック。つまらない処理を担当するsafe_read.c,safe_write.cでは、1つのソースから2個のプログラムを吐いちまおうって寸法。簡単にread.cとwrite.cを作ってテストしてみた。 writ…