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

大学時代に少し読みかけたが結局積ん読になっていたふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道を読んだ。

当時はサーバーのことよくわからんかったし、MAMPとか使ってPHPを弄る程度の初心者だったので厳しかった。

今になって読むとかなり理解できるところが多くなってて一応あの頃よりは知識ついたんだなという気持ちになった。

この本を読んで、サーバー上でプロセスが他のデバイスやファイルとどうやって会話してるのかみたいなことは順をおって最低限説明できるレベルになったかもと思う。

あと、大学時代含めC言語を全然やってなかったから基本的なシンタックスとかポインタとか復習した。

本書はCのコードがたくさん出てくるので復習しといてよかったと思う。

最後に、株式会社GIFMAGAZINEではふつうのLinuxプログラミングが好きなエンジニアを募集しています。

  • 興味ある人はこっちに連絡くれてもOKです → @razokulover

以下は読んでる時にScrapboxで取った読書メモ。

ブログの投稿には、sb2mdを使ってMarkdown変換した。


  • プロセス・ストリーム・ファイルの観点からLinuxの仕組みについて書いてある
  • ストリーム
    • open
      • ストリームを作成する
    • read
      • ストリームからバイト列を読み込む
    • write
      • ストリームにバイト列を書き込む
    • close
      • ストリームを閉じる
  • プロセス <-> ストリーム <-> ファイル
  • バッファリング
    • システムコールのread/writeはプログラムのread/writeより遅い
    • 1バイトずつ読みたいときなどは何度もreadのシステムコールを実行しないといけない
    • ただ何度も実行すると遅い
    • これを避けるために プログラム側でバッファ(たぶんメモリ領域)を設けて 、ある程度のサイズ分まとめてread/writeできるようにしておく。
    • もしプログラム側で1バイトずつ読みたいときも、read(2)でバッファにある程度まとめて読んでおき、プログラム側でそのバッファから1バイトずつ読むようにすると直接システムコールで何度も1バイトずつ読むよりずっと高速になる
  • ファイルシステム
    • /usrはuserの略だと思ってたがUser Services and Routinesの略らしい
    • /devもdevelopじゃなくdeviceだった...
    • 名前(リンク)とファイルの実体
      • ファイルの実体と名前(リンク)は分かれてる
      • ハードリンク
        • 名前 => ファイル
      • シンボリックリンク
        • 名前 => 名前 ...> ファイル
        • 直接名前がファイルの実体に紐づいてない
      • ファイルの実体から名前をすべて消すと削除になる
      • だからunlinkで削除になるのか。理解した。
      • ファイルの移動は新しい名前を作って古い名前を消すってことになる
  • プロセス
    • メモリ管理
      • CPUと物理メモリと仮想メモリ
        • プロセスの動作にはCPU&メモリが必要
        • 複数プロセスを起動するにはCPUが定期的に処理&物理メモリの特定領域(ページ)と1対多で紐づく論理メモリ空間を使う
        • メモリマップトファイル
      • malloc,calloc,realloc,free,brk
      • ダイナミックリンク(共有ライブラリ)
        • 要はライブラリ
        • サーバーでmysql2をインストールするときによく*.so.5ファイルがありませんみたいなエラーでるな
        • あれはCのプログラムが実行時に必要なライブラリ == ダイナミックリンクが存在しないから発生してた
        • lddすると実行プログラムで使ってるダイナミックリンクが一覧できる
        • Cについて全然知識なくて無知すぎる...
    • 親プロセスと子プロセス
      • 親からfork()すると親プロセスを丸ごと複製する
      • そこでexec()を実行すると親とは別にプログラムが実行できる
      • 親は子の実行結果をwait()すると待つことができる
    • ゾンビプロセス
      • 親が子の実行をwaitしないで実行終了すると子が取り残される == ゾンビプロセス
      • forkをforkするとゾンビにならない
  • シグナル
    • プロセスに対して何かしらの指令を出すこと
    • SIGHUPとかよく使うがあれ。デーモンにSIGHUP送ると再起動になるあれ。
    • 関数ポインタ
      • 慣れない...
    • 13.4 ctrl + cでプロセスを停止できるのかの仕組みわかりやすい。順を追ってshellとプロセスの内部動作が説明されててわかりやすい
  • ネットワークプログラミング
  • 18章のまとめのボリュームやばい
    • この本のあとに読むべき書籍やツールなどについてしっかりまとめらてる
    • ただ濃密な参考書籍ばかり(古いの多い)なので自分に合わせて選んだ方がよいかも感