第六回スパルタンプログラミング
へとへとに疲れ果てたのにもかかわらず、ソーセージをひき肉から作り、全粒粉パスタは二度度買うまいと僕は誓った。
そう、それは第六回スパルタンプログラミングの日
前回の復習
fgetsソース読み
ブロッキング、非ブロッキングのふるまいはどこで変わるか?をfgetsで調べる。
呼び出し順序:fgets→fgetc→Frprep→Fread eq _Read→vfsread
- fileのfile_operationsの関数ポインタreadに代入されている関数
- do_sync_read
のいずれかを実行する。今の場合、1.は代入されてないらしい(いっしー調べ)ので、2.を調査。
do_sync_readはf_opのaio_readを実行する。
このaio_readにはsocket_file_opsのsock_aio_readが代入されてるはずで、
sock_aio_readは do_sock_readをよぶ。
でだ、ここでO_NONBLOCKでビット演算がある。
__sock_recvmsgはsocket_recvmsg型の関数で inet_recvmsg を使ってるだろうと飛躍して、
recvmsg を見る。
__sys_recvmsgの __put_userでアセンブリと絡んで終了。
結局ブロッキングか非ブロッキングは何を以てデータがきたかどうかの判断をアセンブリレベルで行って、そこで判定しているということだろうということで終わりにする。
いっしーがいなかったら、一日以上かかっても??のままだったのを午前中でけりをついたことにできた。
今日何がしたいか
- リクエストに応答したい!
参考ソース
いっしーが参考ソースとして、
を持ってきて、僕は
- mattnのhttp-server(mattn:変態vimmer、変態は褒め言葉、誤解なきよう)
を見つけてたのでそれを眺める。
今日できたこと
- いっしーのyylex()を文字列から動かせるやつを移植。
- .hファイルを整理して、インクルードガードを覚えていれた。
- 自由なログはきをいっしーが見つけてくれたのでいれた。そうそう、こんなのが欲しかった!
#define debug_print(fmt, ...) \ do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \ __LINE__, __func__, __VA_ARGS__); } while (0)