読者です 読者をやめる 読者になる 読者になる

ポジローぽけっと

昨日より今日、今日より明日を信じて、トライトライ

第六回スパルタンプログラミング

へとへとに疲れ果てたのにもかかわらず、ソーセージをひき肉から作り、全粒粉パスタは二度度買うまいと僕は誓った。

そう、それは第六回スパルタンプログラミングの日

前回の復習

ブロッキング、非ブロッキングのふるまいはどこで変わるか?

fgetsソース読み

ブロッキング、非ブロッキングのふるまいはどこで変わるか?をfgetsで調べる。

呼び出し順序:fgets→fgetc→Frprep→Fread eq _Read→vfsread

vfsread

  1. fileのfile_operationsの関数ポインタreadに代入されている関数
  2. do_sync_read

のいずれかを実行する。今の場合、1.は代入されてないらしい(いっしー調べ)ので、2.を調査。

do_sync_readはf_opのaio_readを実行する。

このaio_readにはsocket_file_opsのsock_aio_readが代入されてるはずで、

sock_aio_readdo_sock_readをよぶ。

でだ、ここでO_NONBLOCKでビット演算がある。

__sock_recvmsgはsocket_recvmsg型の関数で inet_recvmsg を使ってるだろうと飛躍して、

recvmsg を見る。

__sys_recvmsgの __put_userでアセンブリと絡んで終了。

結局ブロッキングか非ブロッキングは何を以てデータがきたかどうかの判断をアセンブリレベルで行って、そこで判定しているということだろうということで終わりにする。

いっしーがいなかったら、一日以上かかっても??のままだったのを午前中でけりをついたことにできた。

今日何がしたいか

  • リクエストに応答したい!

参考ソース

いっしーが参考ソースとして、

  • nginx(えんじんえっくす:読みづらい、日本語読みでえぬじんくすの方がいい)
  • lighttpd(通称ライティ(:mainはlemon.cにある。lemon?)

を持ってきて、僕は

を見つけてたのでそれを眺める。

今日できたこと

  • いっしーのyylex()を文字列から動かせるやつを移植。
  • .hファイルを整理して、インクルードガードを覚えていれた。
  • 自由なログはきをいっしーが見つけてくれたのでいれた。そうそう、こんなのが欲しかった!
#define debug_print(fmt, ...) \
        do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
                                __LINE__, __func__, __VA_ARGS__); } while (0)