Linux PROGRAMMER'S TOOLBOX
第1章 オープンソースツールのダウンロードとインストール
1 はじめに
2 オープンソースとは?
3 オープンソースが意味するもの
 3-1 ツールの探し方
 3-2 ディストリビューションのフォーマット
4 アーカイブファイルの概要
 4_1 アーカイブファイルの種類を特定する
 4_2 アーカイブファイルから内容情報を取り出す
 4_3 アーカイブファイルからファイルを取り出す
5 パッケージマネージャについて知ろう
 5_1 ソースとバイナリのどちらを選ぶか
 5_2 パッケージマネージャの機能
6 パッケージのセキュリティについて
 6_1 パッケージ検証の必要性
 6_2 基本的なパッケージ検証方法
 6_3 デジタル署名によるパッケージ検証
 6_4 RPMにおけるGPG署名
 6_5 パッケージを検証できない場合
7 パッケージの内容を調べる
 7_1 パッケージを調べる方法
 7_2 RPMパッケージを詳しく見てみよう
 7_3 Debianパッケージを詳しく見てみよう
8 パッケージをアップデートする
 8_1 Apt(Advanced Package Tool)
 8_2 Yum(Yellowdog Updater Modified)
 8_3 Synaptic(AptのGUIフロントエンド)
 8_4 up2date(The Red Hat Package Updater)
9 まとめ
 9_1 この章で使用しているツール
 9_2 オンラインリファレンス

第2章 ソースからのビルド

1 はじめに
2 ビルドツール
 2-1 背景
 2-2 makeを理解しよう
 2-3 プログラムのリンク方法
 2-4 ライブラリを理解しよう
3 ビルド方法
 3-1 GNUビルドツール
 3-2 configure段階
 3-3 ビルド段階:make
 3-4 インストール段階:make install
4 エラーと警告を理解する
 4-1 Makefileでよくある間違い
 4-2 configure段階で生じるエラー
 4-3 ビルド段階で生じるエラー
 4-4 コンパイラのエラーを理解する
 4-5 コンパイラの警告を理解する
 4-6 リンカのエラーを理解する
5 まとめ
 5-1 この章で使用しているツール
 5-2 オンラインリファレンス

第3章 ヘルプの検索

1 はじめに
2 オンラインヘルプツール
 2-1 manページ
 2-3 manページの検索:apropos
 2-4 適切なmanページを取得する:whatis
 2-5 manページで見つけられること
 2-6 おすすめのmanページ
 2-7 GNU info
 2-8 infoページの閲覧
 2-9 infoページの検索
 2-10 おすすめのinfoページ
 2-11 デスクトップヘルプツール
3 その他に調べる場所
 3-1 /usr/share/doc
 3-2 相互参照と索引
 3-3 パッケージへの問い合わせ
4 文書の形式
 4-1 TeX/LaTeX/DVI
 4-2 Texinfo
 4-3 DocBook
 4-4 HTML
 4-5 PostScript
 4-6 PDF(Portable Document Format)
 4-7 troff
5 インターネットの情報源
 5-1 www.gnu.org
 5-2 SourceForge.net
 5-3 Linux Documentation Project
 5-4 Usenet
 5-5 メーリングリスト
 5-6 その他のフォーラム
6 カーネルに関する情報を探す
 6-1 カーネルのビルド
 6-2 カーネルモジュール
 6-3 種々雑多な文書
7 まとめ
 7-1 この章で使用しているツール
 7-2 オンラインリソース

第4章 ソースファイルの編集と管理

1 はじめに
2 テキストエディタ
 2-1 デフォルトのエディタ
 2-2 テキストエディタに求めるもの
 2-3 二大エディタ:viとEmacs
 2-4 Vim:viの改良版
 2-5 Emacs
 2-6 クローンの攻撃
 2-7 その他のGUIテキストエディタ
 2-8 メモリ使用量
 2-9 エディタのまとめ
3 リビジョン制御
 3-1 リビジョン制御の基本
 3-2 リビジョン制御の用語定義
 3-3 支援ツール
 3-4 diffとpatch
 3-5 変更の参照とマージ
4 ソースコードの整形と閲覧ツール
 4-1 コードのインデントを整形するツール
 4-2 芸術的なAstyleスタイル
 4-3 cflowによるコードの解析
 4-4 ctagsによるコードの解析
 4-5 cscopeによるコードの閲覧
 4-6 Doxygenによるコードの閲覧と文書化
 4-7 コンパイラを使用してコードを解析する
5 まとめ
 5-1 この章で使用しているツール
 5-2 参考文献
 5-3 オンラインリソース

第5章 カーネルについて開発者が知るべきこと

1 はじめに
2 ユーザモードとカーネルモード
 2-1 システムコール
 2-2 ユーザモードとカーネルモード間のデータ移動
3 プロセススケジューラ
 3-1 スケジューリング入門
 3-2 ブロック、プリエンプション、イールド
 3-3 スケジュールの優先度と公平性
 3-4 優先度とnice値
 3-5 リアルタイム優先度
 3-6 リアルタイムプロセスを作成する
 3-7 プロセスの状態
 3-8 時間の測定方法
4 デバイスとデバイスドライバ
 4-1 デバイスドライバの種類
 4-2 カーネルモジュールについて
 4-3 デバイスノード
 4-4 デバイスとI/O
5 I/Oスケジューラ
 5-1 Linus Elevator
 5-2 deadline I/Oスケジューラ
 5-3 anticipatory I/Oスケジューラ
 5-4 Complete Fair Queuing I/Oスケジューラ
 5-5 I/Oスケジューラの選択
6 ユーザ空間におけるメモリ管理
 6-2 メモリ不足
7 まとめ
 7-1 この章で使用しているツール
 7-2 この章で解説したAPI
 7-3 オンラインリファレンス
 7-4 参考文献

第6章 プロセスを理解する

1 はじめに
2 プロセスの由来
 2-1 forkとvfork
 2-2 コピーオンライト
 2-3 clone
3 exec関数
 3-1 実行可能スクリプト
 3-2 実行可能オブジェクトファイル
 3-3 種々雑多なバイナリ
4 waitによるプロセスの同期
5 プロセスフットプリント
 5-1 ファイルディスクリプタ
 5-2 スタック
 5-3 常駐およびロックされたメモリ
6プロセスの制限
7 プロセスとprocfs
8 プロセスを管理するためのツール
 8-1 psによるプロセス情報の表示
 8-2 書式による詳細なプロセス情報
 8-3 psとpgrepによる名前でプロセスを検索する
 8-4 pmapでプロセスのメモリ使用量を観察する
 8-5 名前を指定してプロセスにシグナルを送る
9 まとめ
 9-1 この章で使用したシステムコールとAPI
 9-2 この章で使用したツール
 9-3 オンラインリソース

第7章 プロセス間通信

1 はじめに
2 通常のファイルを用いたIPC
 2-1 ファイルのロック
 2-2 ファイルを用いたIPCの欠点
3 共有メモリ
 3-1 POSIX APIにおける共有メモリ
 3-2 System V APIにおける共有メモリ
4 シグナル
 4-1 プロセスにシグナルを送る
 4-2 シグナルの処理方法
 4-3 シグナルマスクとシグナルハンドル
 4-4 リアルタイムシグナル
 4-5 sigqueueとsigactionによる高度なシグナル
5 パイプ
6 ソケット
 6-1 ソケットの作成
 6-2 socketpairを用いたローカルソケットの例
 6-3 ローカルソケットを用いたクライアント/サーバの例
 6-4 ネットワークソケットを用いたクライアントサーバ
7 メッセージキュー
 7-1 System Vのメッセージキュー
 7-2 POSIXのメッセージキュー
 7-3 POSIXメッセージキューとSystem Vメッセージキューの違い
8 セマフォ
 8-1 POSIX APIのセマフォ
 8-2 System V APIのセマフォ
9 まとめ
 9-1 この章で使用したシステムコールとAPI
 9-2 リファレンス
 9-3 オンラインリソース

第8章 シェルコマンドによるIPCのデバッグ

1 はじめに
2 開いているファイルと連携するツール
 2-1 lsof
 2-2 fuser
 2-3 ls
 2-4 file
 2-5 stat
3 ファイルのデータをダンプする
 3-1 stringsコマンド
 3-2 xxdコマンド
 3-3 hexdumpコマンド
 3-4 odコマンド
4 System V IPC用のシェルツール
 4-1 System V共有メモリ
 4-2 System Vメッセージキュー
 4-3 System Vのセマフォ
5 POSIX IPCと連携するツール
 5-1 POSIX共有メモリ
 5-2 POSIXメッセージキュー
 5-3 POSIXセマフォ
6 シグナルと連携するツール
7 パイプおよびソケットと連携するツール
 7-1 パイプとFIFO
 7-2 ソケット
8 inodeを使用してファイルとIPCオブジェクトを識別する
9 まとめ
 9-1 この章で使用したツール
 9-2 オンラインリソース

第9章 パフォーマンスの調整

1 はじめに
2 システムパフォーマンス
 2-1 メモリの問題
 2-2 CPU使用率とバスの競合
 2-3 デバイスと割り込み
 2-4 システムパフォーマンス問題を検出するためのツール
3 アプリケーションのパフォーマンス
 3-1 まずはtimeコマンドを使用してみる
 3-2 x86infoを使用してプロセッサのアーキテクチャを理解する
 3-3 Valgrindを使用した命令効率の分析
 3-4 ltraceの導入
 3-5 straceを用いてプログラムのパフォーマンスを監視する
 3-6 伝統的なパフォーマンスチューニングツール:gcovとgprof
 3-7 OProfileの導入
○OProfileの終わりに
4 マルチプロセッサのパフォーマンス
 4-2 SMPマシンでのプログラミング
5 まとめ
 5-1 この章で扱ったパフォーマンス問題
 5-2 この章で使用した用語
 5-3 この章で使用したツール
 5-4 オンラインリソース
 5-5 リファレンス

第10章 デバッギング

1 はじめに
2 最も基本的なデバッギングツール:printf
 2-1 printfの使用に伴う問題
 2-2 printfの効率的な使用方法
 2-3 printfデバッギングの最後に
3 GNUデバッガに慣れよう:gdb
 3-1 gdbでコードを実行する
 3-2 実行の停止と再開
 3-3 データの検査と操作
 3-4 gdbで実行中のプログラムにアタッチする
 3-5 コアファイルのデバッギング
 3-6 gdbによるマルチスレッドプログラムのデバッギング
 3-7 最適化コードのデバッギング
4 共有オブジェクトのデバッギング
 4-1 いつ、どういう理由で共有オブジェクトを使用するのか
 4-2 共有オブジェクトの作成
 4-3 共有オブジェクトの位置決定
 4-4 共有オブジェクトのデフォルト位置を上書きする
 4-5 共有オブジェクトのセキュリティ問題
 4-6 共有オブジェクトと連携するためのツール
5 メモリの問題を見つける
 5-1 二重解放
 5-2 メモリリーク
 5-3 バッファオーバーフロー
 5-4 glibcツール
 5-5 Valgrindを使用したメモリ問題のデバッグ
 5-6 Electric Fenceでオーバーフローを見つける
6 型にはまらない方法
 6-1 独自のブラックボックスを作成する
 6-2 実行時にバックトレースを取得する
 6-3 強制的なコアダンプ
 6-4 シグナルの使用
 6-5 デバッギングにprocfsを使用する
7 まとめ
 7-1 この章で使用したツール
 7-2 オンラインリソース
 7-3 リファレンス