いわゆる「システムプログラミング」の入門書。
タイトル通り Linux の仕組みを学びながら、実際に C 言語でコマンドや HTTP サーバを実装していく。
本当に初学者向けの入門書であり、カーネルとは、システムコールとは、というところから説明していく。
そのため、システムプログラミングやコンピュータサイエンスの下地がなくても、多少なりともプログラミング経験のある人なら問題なく読めると思う。
C 言語についても、アクロバティックなことはやっていないし、特に序盤はかなり丁寧に説明しているので、未経験でも大丈夫だと思う。何より今は AI チャットがあるので、わからないことがあったら説明させればよい。本書が扱っている C 言語や初歩的なシステムプログラミングは相当に枯れているので、ハルシネーションのリスクも低い。
ファイルシステム、プロセス、ストリーム、が本書の軸になっているが、この 3 つで Linux の世界を整理してしまうことで、その後の説明がかなりスムーズになっている印象を受けた。抽象化が上手い。それはそもそも Linux の抽象化が上手いという話かもしれないが、やはり本書の説明はかなり上手いと思う。適切に取捨選択して初学者向けに上手く説明している。
実際に動くものを作る、というのがよい。概念的な説明や断片的なコード片の提示で終わらず実際に動作するものを作れるから、理解が捗る。
サンプルコードを可能な限りシンプルに保とうとしているのもよい。変に作り込んで分かりづらくしたりせず、伝えたい内容や理解すべき内容にフォーカスしている。
サンプルコードは GitHub で公開されており、本書で何を学べるか、これを見ることでなんとなく分かると思う。
コンピュータが動作する仕組み、というものに興味があり、その手の記事や書籍をいくつか読んできたが、どうしてもセマンティックギャップを感じてしまう。CPU の基本的な仕組みであるとか、メモリ管理の話であるとか、そういったものを読んで理解しても、それが普段使っているソフトウェアやアプリケーションとなかなか結びつかない。理屈としては分かるのだが、実感が湧かない。複雑なソフトウェアやシステムが、 CPU 、メモリ、機械語といったプリミティブな要素によって成り立っている、ということにリアリティを感じづらい。自分が日常的に触っているレイヤーは何重にも抽象化された結果なので、どうしてもギャップがある。
本書を読んでセマンティックギャップが解消された、とまでは言わないが、少しは実感を得られた。やはり実際に手を動かし、動作するものを作るのがよい。
本書の最後の題材として HTTP サーバを作るのだが、それが特によかった。本書でも注意書きがあるように「実用」に耐えうるものではないが、それでも動作はする。curl で HTTP リクエストを送信すればちゃんとレスポンスが返ってくる。
本書の最初のほうでcatコマンドやheadコマンドを作る。それらを題材としてopen()やwrite()といったシステムコールの使い方を学ぶ。この時点ではコードはかなり短く、やっていることもかなり単純。学習用の、非常にシンプルな実装。HTTP サーバも基本的にはその延長線上にあるんだ、と感じることができたのがよかった。やっていることはcatとそう変わらない。ファイルディスクリプタを取得して、それを使ってopen()して、それに対して読み書きを行う。極論すればそれだけ。「UNIX では全てのものをファイルとして扱う」というのはなんとなく知っていたが、それを実感することができた。
HTTP サーバはfork()の実用例にもなっており、それもよかった。