書評:ふつうのLinuxプログラミング、あるいはHTTPサーバーについておおざっぱに

2012-11-11#book

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

OSの仕組みをちゃんと理解しておこうと思って買ってみた。

以前、「Working With UNIX Processes」という本を読んで、プロセスの仕組みがだんだんわかってきたので、OSの他の部分も知りたいということで次に読んだのがこれ。

読む前のレベル

もうちょっとC言語を勉強すべきだった

内容としては、OSの基本的な概念を紹介し、それらを操作するためのC言語の関数とコード例が出てくる。対象読者のところで、C言語の基本的な理解を前提としているのは、本当そのとおりだった。構造体がバンバン出てくる。あと拙者にはfputc,putc,fputs,putsの区別がつかなかった。

出直してきます…orz

HTTPサーバーをなんとなく理解

とはいえ、最後の方に出てくるHTTPサーバーのコード例はとても勉強になった。

ソケットAPIの説明が簡略だったため、詳しく理解することはできなかったものの、なんとなくHTTPサーバーが何をしているのかがわかった。

  1. getaddrinfo(3)で自分(つまりサーバー)の情報(ホスト、プロトコルなど)を取得する。
  2. 取得した情報を使ってsocket(2)でソケットを作る。ソケットはファイルディスクリプタ(ただの通し番号)として参照される。
  3. そのソケットに対してbind(2)してlisten(2)する。(詳しい説明がなかったので、ここらへんよくわからない…)
  4. そのソケットに対してaccept(2)する。これをすると、サーバーはクライアントからの接続を待つ。接続に成功したら、接続したソケットを返す。
  5. 接続したソケットはファイルディスクリプタなので、fdopen(3)を使って読み書きできる。リクエストを読んで、レスポンスを返す処理はここで行う。(接続したソケットへの書き込みはそのままクライアントに返されるのだろうか…?ここらへんもよくわかってない…)
  6. 複数のリクエストをさばくには、5.の処理を並列化する必要があるので、fork(2)を使って子プロセスにこの処理を任せる。親プロセスはすぐにもう一度accept(2)してリクエストを待つ。

おおざっぱな流れはこんな感じで理解した。

リクエストを読んでレスポンスを返す処理は、とても地味な処理だった。TCP/IPに従ってリクエストをパースして、その結果にもとづいてレスポンスを決めるような処理だったと記憶してる。

並列化はコード例ではマルチプロセスでの実装だったけど、他の実装も知りたい。

残る疑問

入門書ということもあり、途中はしょった部分があったので、いくつか疑問が残った。

本書では、次に読むべき本としていくつか紹介されているので、それらを読めば疑問が解決しそう。とてもありがたい。ネットワークに関する本であればこれとか。

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

↑高いw