「ふつうのLinuxプログラミング」を読んだ

日頃 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言語を存分に楽しむことができた。 文字列の比較やコピーするために strcmpstrcpy といった専用の関数を使うなんて今日日なかなか味わえないだろう。

最終的に出来上がる HTTP サーバもかなり原始的なものであるが、現代において socket を明示的に使用してサーバを建てるなんてことは早々ないと思うのでなかなか貴重な体験ができた。

i.loveruby.net

github.com