日頃 Linux を使っているものの、Linux について全然理解していないなぁと思っていたので「ふつうの Liunx プログラミング」を読んでみた。 読み終わるまでに22時間12分かかった。
この本の構成は以下の通り
●目次 第1部 Linuxの仕組み 第1章 Linuxプログラミングを始めよう 第2章 Linuxカーネルの世界 第3章 Linuxを描き出す3つの概念 第4章 Linuxとユーザ 第2部 Linuxプログラミングの根幹 第5章 ストリームにかかわるシステムコール 第6章 ストリームにかかわるライブラリ関数 第7章 headコマンドを作る 第8章 grepコマンドを作る 第9章 Linuxのディレクトリ構造 第10章 ファイルシステムにかかわるAPI 第11章 プロセスとハードウェア 第12章 プロセスにかかわるAPI 第13章 シグナルにかかわるAPI 第14章 プロセスの環境 第3部 Linuxネットワークプログラミング 第15章 ネットワークプログラミングの基礎 第16章 HTTPサーバを作る 第17章 HTTPサーバを本格化する 第18章 本書を読み終えたあとは
第1部で Linux の概要、第2部で実際に手を動かして system call
や各種 API を使い、第3部ではそれらの知識を総動員して HTTP サーバを作るという流れになっている。
この本の良いところはなんといっても手を動かしながら学べることだと思う。
この本で扱っているような内容は初心者向きの本や記事だと概念的なものにとどまっているが、逆に専門書だと私のような基礎のない者からすると始めで撃沈してしまう。この本はちょうど両者の橋渡し的な本のように思う。
言語は一貫してC言語を使用している。各種APIの使い方の解説はあるが、C言語の文法の話は基本的に無いので、C言語を使ったことがないという方は先にC言語の入門書(苦Cなど)を読むことをおすすめする。
最後の書籍案内のところで著者が「私はかなり保守的な(堅い)書籍を選ぶ傾向があります。」とおっしゃっているが、そのような方が書く本であるので、巷の「○日できる XX」のような書籍とは趣が異なる。 おそらく、この本を読んでも実務において役に立つことは少ないと思われる。
しかし、今までブラックボックスというか、なんとなくで使っていた部分の詳細を知ることができ私はとても満足できた。
具体的には FILE
にはファイルディスクリプタに加え stdio
のバッファの内部情報が入っているということを知らなかったし、簡単なシェルならばC言語でも150行程度でかけるとは思ってもみなかった。
https://github.com/aamine/stdlinux2-source/blob/master/sh1.c
また、最近のプログラミング言語はGCが付いているのが当たり前で、自分でメモリ管理をするなんてことは滅多にないが、C言語ということもあって malloc
, free
を使って自らメモリ管理しなければならない。ポインタ演算も当然出てきて、いかにもなC言語を存分に楽しむことができた。
文字列の比較やコピーするために strcmp
や strcpy
といった専用の関数を使うなんて今日日なかなか味わえないだろう。
最終的に出来上がる HTTP サーバもかなり原始的なものであるが、現代において socket
を明示的に使用してサーバを建てるなんてことは早々ないと思うのでなかなか貴重な体験ができた。