ふつうの Linux プログラミングを読んだ
TL;DR
- 途中まで読んで止まっていた「ふつうの Linux プログラミング」を読んだ
- C 言語で Linux のライブラリ関数や HTTP サーバの実装などを介して必要な要素を学ぶスタイル
- 平易な言葉で書かれていて、自分のように基礎知識がない人の学び始めには良さそう
だいぶ前(一年半くらい前)に「ふつうの Linux プログラミング 第2版」を読んでいたが、途中で止まっていた。
Linuxとか全然分かってないので、同僚が執筆した「ふつうの Linux プログラミング」を買って読み始めた。こういうこと勉強したかったんだよなぁということが書いてあって凄く良い。粛々と読んでいこう。
— Yohei KIKUTA (@yohei_kikuta) 2017年10月3日
遅ればせながら一通り読んだので感想を残しておく。 ちなみに書籍の Amazon へのリンクは こちら になります。
全体的な流れ
第1部では Linux の世界ということでカーネルに注目して、特に重要な概念として「ファイルシステム」「プロセス」「ストリーム」という概念を中心に説明。 ストリームという言葉は少し注意が必要で、普通の Unix/Linux で使われるところの用語ではなくて、ファイル(これすなわちバイト列)がバイトストリームということでその意味でストリームという用語を使っている。 こうすることで用語の混乱が生じる可能性もあるが、バイトストリームとして強く意識させることで、例えばプロセスが regular file にアクセスする状況を概念的に分かりやすくしている。 バイトストリームであるのでデバイスとのやり取りやパイプやネットワーク通信も同様の枠組みに乗ることが理解できるようになっている。 Linux においては全てがファイルなので、ここでいうストリームという概念を持ち出さなくても分かっている人には明らかではあるが、慣れていない人にはこのような明示的な名前が与えられた方がわかりやすいと思う。 この辺りは著者が読み手の理解のために工夫して書いてくれているなと感じるところである。
第2部では Linux プログラミングの根幹ということでライブラリ関数を再実装しながら、ストリームとそれに係るシステムコールやライブラリ関数を理解していくところから始まる。 その後はファイルシステムやプロセスという重要概念の説明に割かれている。 最初にこの本を読んだときは C 言語の知識がゼロだったのでどうしてもそっちに気を取られて本の内容が理解しきれなかったが、最近は多少慣れてきたので本の内容に集中することができたのでちゃんと読むことができた。 色々なシステムコールやライブラリ関数が登場するので、それを man コマンドで読んでみるという行動を取りやすくなるのが良かった。 読む前の自分の知識と差分が大きかったのが第12章のプロセスにかかわる API と第13章のシグナルにかかわる API の部分で、この辺りは読んでてためになった。
第3部は Linux ネットワークプログラミングで、これまで学んだ概念を使いながら HTTP サーバを作ってみるというものだ。 自分はこういった経験に乏しいので、ページ数を割いてこういうトピックを提供してくれるのは良かった。 内容の好みは人に依るところかもしれないが、少なくとも自分にとっては有り難かった。 Linux の世界は広大で奥が深いので、最終章ではより詳しく学んでいくためのレファレンスを数多く提供してくれている点も嬉しい。
印象に残っているところ
やはりまずはプロセスが他のプロセスやファイルシステムとバイトストリームという手段を介してやり取りするという Linux のモデルの部分だ。 バイトストリームを扱うということを意識して、デバイスとのやり取りやパイプなどがごく自然に同じ仕組みで扱えるというのは学び始めでは感動するところだ。
システムコールとかライブラリ関数を man コマンドでよく眺めるようになったというのも本書を読んで良かったところと思う。 詳しくは man コマンドを読め、と言われるのでそれに従って読んでいるうちに、自分でもある程度は勝手に見にいくようになる。
プロセスにかかわる API の部分で fork(2)
exec(2)
wait(2)
といったシステムコールを基にプロセスを理解するというのは良い勉強になった。
ユーザのログイン・ログアウトを管理するセッション、そのセッションと関連づけられた制御端末、一つのセッションが複数のプロセスグループを束ねてその情報が tcsetpgrop(3)
で得られる、辺りはよく整理されていた。
おかげでプロセスに関しての基本的なところは少しずつ身についてきたと思う。
そこからシグナルを補足してプロセスが変更できる話に進み、signation(2)
とか、それを使って Ctrl + C
での SIGINT
がプロセスグループに送られ終了するという仕組みが「おーこうなってるのね」と分かって楽しい。
HTTP サーバを作ってみるというのも自分はこういうのをやったことないので面白かった。
最初は標準入出力だけをターゲットに作って、その後 socket(2)
などを使った接続とデーモン化などを経てブラウザアクセスもできるようになってそれっぽくなる。
普通のエンジニアの人がこういうのをいつどこでやるのかはよく知らないが、自分はこれまでなかなか機会がなかったのでとてもためになった。
まとめ
ふつうの Linux プログラミング 第2版を読んだ。 自分の知識レベルでも理解できるように書いてあって良書だった。 これをきっかけにもう少し詳しく勉強していこう。
この場を借りてこっそり青木さんにお礼を言っておこう。 本良かったです、ありがとうございました。