書評:ふつうのLinuxプログラミング、あるいはHTTPサーバーについておおざっぱに
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
- 作者: 青木峰郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/07/27
- メディア: 単行本
- 購入: 32人 クリック: 378回
- この商品を含むブログ (138件) を見る
OSの仕組みをちゃんと理解しておこうと思って買ってみた。
以前、「Working With UNIX Processes」という本を読んで、プロセスの仕組みがだんだんわかってきたので、OSの他の部分も知りたいということで次に読んだのがこれ。
読む前のレベル
- メインで使うのはRuby。最近、Objective-Cも書き始めた。つまり、ゆとりプログラマー。
- C言語はWebの入門記事をちょろっとやった程度。ポインタとか構造体とかよくわからない…
- 実務ではサーバーがLinux(Ubuntu)で、基本的な作業はひととおりできる。
- 「Working With UNIX Processes」を読んだので、多少プロセスについては前提知識がある。
もうちょっとC言語を勉強すべきだった
内容としては、OSの基本的な概念を紹介し、それらを操作するためのC言語の関数とコード例が出てくる。対象読者のところで、C言語の基本的な理解を前提としているのは、本当そのとおりだった。構造体がバンバン出てくる。あと拙者にはfputc
,putc
,fputs
,puts
の区別がつかなかった。
出直してきます…orz
HTTPサーバーをなんとなく理解
とはいえ、最後の方に出てくるHTTPサーバーのコード例はとても勉強になった。
ソケットAPIの説明が簡略だったため、詳しく理解することはできなかったものの、なんとなくHTTPサーバーが何をしているのかがわかった。
-
getaddrinfo(3)
で自分(つまりサーバー)の情報(ホスト、プロトコルなど)を取得する。 - 取得した情報を使って
socket(2)
でソケットを作る。ソケットはファイルディスクリプタ(ただの通し番号)として参照される。 - そのソケットに対して
bind(2)
してlisten(2)
する。(詳しい説明がなかったので、ここらへんよくわからない…) - そのソケットに対して
accept(2)
する。これをすると、サーバーはクライアントからの接続を待つ。接続に成功したら、接続したソケットを返す。 - 接続したソケットはファイルディスクリプタなので、
fdopen(3)
を使って読み書きできる。リクエストを読んで、レスポンスを返す処理はここで行う。(接続したソケットへの書き込みはそのままクライアントに返されるのだろうか…?ここらへんもよくわかってない…) - 複数のリクエストをさばくには、5.の処理を並列化する必要があるので、
fork(2)
を使って子プロセスにこの処理を任せる。親プロセスはすぐにもう一度accept(2)
してリクエストを待つ。
おおざっぱな流れはこんな感じで理解した。
リクエストを読んでレスポンスを返す処理は、とても地味な処理だった。TCP/IPに従ってリクエストをパースして、その結果にもとづいてレスポンスを決めるような処理だったと記憶してる。
並列化はコード例ではマルチプロセスでの実装だったけど、他の実装も知りたい。
残る疑問
入門書ということもあり、途中はしょった部分があったので、いくつか疑問が残った。
- ソケットAPIがやってることが謎。
bind(2)
してlisten(2)
する部分が何をやってるか不明。 - 接続したソケットへの出力はそのまま接続先のクライアントに出力されるんだろうか?この背後でまだいろいろやってそうな気配を感じる。
- 処理が終わった子プロセスはゾンビ化すると思うんだけど、どうやって
wait(2)
して終了させるんだろう? - マルチプロセス以外の並列化の実装も知りたい。C10K問題というキーワードも関連してくる気がするし、node.jsもここらへんに関する技術な気がする。
本書では、次に読むべき本としていくつか紹介されているので、それらを読めば疑問が解決しそう。とてもありがたい。ネットワークに関する本であればこれとか。
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
- 作者: W.リチャードスティーヴンス,W.Richard Stevens,篠田陽一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 1999/07
- メディア: 単行本
- 購入: 7人 クリック: 122回
- この商品を含むブログ (35件) を見る
↑高いw