Linuxのmanページプロジェクト主催者によるLinuxプログラマ必携のリファレンス。Linux開発者(主にシステムプログラマとアプリケーションプログラマ)にとって、プログラミングする上で必要な情報を一冊で網羅。本書で扱う内容は広範囲にわたり一冊でLinuxプログラミングのほぼすべての情報を知ることができます。Linux/UNIX開発者のバイブルとなる一冊です。
Linuxプログラミングインタフェース
Michael Kerrisk 著、千住 治郎 訳
- TOPICS
- Programming , Linux
- 発行年月日
- 2012年12月
- PRINT LENGTH
- 1604
- ISBN
- 978-4-87311-585-6
- 原書
- The Linux Programming Interface
- FORMAT
- Print PDF EPUB
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
第3刷正誤表
1270ページ、「59.6 inet_pton() とinet_ntop()」1行目
【誤】inet_pton()
はバイナリ形式のIPv4、IPv6アドレスを可読形式へ、【正】
inet_pton()
は可読形式のIPv4、IPv6アドレスをバイナリ形式へ、目次
目次 日本語版に寄せて−著者まえがき まえがき 1章 UNIXの歴史と標準化 1.1 UNIXとCの略史 1.2 Linux略史 1.2.1 GNUプロジェクト 1.2.2 Linuxカーネル 1.3 標準化 1.3.1 C言語 1.3.2最初のPOSIX標準仕様 1.3.3 X/OpenとTheOpenGroup 1.3.4 SUSv3とPOSIX.1-2001 1.3.5 SUSv4とPOSIX.1-2008 1.3.6 UNIX標準仕様の時系列 1.3.7実装の標準 1.3.8 Linux、標準仕様、LinuxStandardBase 1.4 章のまとめ 2章 基礎概念 2.1 オペレーティングシステムのコア:カーネル 2.2 シェル 2.3 ユーザとグループ 2.4 単一ディレクトリ階層、ディレクトリ、リンク、ファイル 2.5 ファイルI/Oモデル 2.6 プログラム 2.7 プロセス 2.8 メモリマッピング 2.9 スタティックライブラリと共有ライブラリ 2.10 プロセス間通信と同期 2.11 シグナル 2.12 スレッド 2.13 プロセスグループとジョブコントロール 2.14 セッション、制御端末、制御プロセス 2.15 疑似端末 2.16 日付と時刻 2.17 クライアント−サーバアーキテクチャ 2.18 リアルタイム性 2.19 /procファイルシステム 2.20 章のまとめ 3章 システムプログラミング 3.1 システムコール 3.2 ライブラリ関数 3.3 標準Cライブラリ:GNUCライブラリ(glibc) 3.4 システムコールとライブラリ関数のエラー 3.5 本書のサンプルプログラムについて 3.5.1 コマンドラインオプションとパラメータ 3.5.2 共通関数とヘッダファイル 3.6 可搬性 3.6.1 機能検査マクロ 3.6.2 システムデータ型 3.6.3 可搬性に関するその他の事柄 3.7章のまとめ 3.8演習 4章ファイル I/O:統一されたインタフェース 4.1 概要 4.2 統一されたインタフェース 4.3 ファイルのオープン:open() 4.3.1 open()へ与えるflags 4.3.2 open()のエラー原因 4.3.3 creat()システムコール 4.4 ファイルからの読み取り:read() 4.5 ファイルへの書き込み:write() 4.6 ファイルのクローズ:close() 4.7 ファイルオフセットの変更:lseek() 4.8 統一I/Oモデルから外れる操作:ioctl() 4.9 章のまとめ 4.10 演習 5章ファイルI/O:その詳細 5.1 アトミック動作と競合状態 5.2 ファイル操作:fcntl() 5.3 オープンファイルステータスフラグ 5.4 ファイルディスクリプタとオープンしたファイルの関係 5.5 ファイルディスクリプタの複製 5.6 指定位置でのファイルI/O:pread()とpwrite() 5.7 スキャッタ−ギャザI/O:readv()とwritev() 5.8 ファイルサイズの変更:truncate()とftruncate() 5.9 ノンブロッキングI/O 5.10 large .leのI/O 5.11 /dev/fdディレクトリ 5.12 テンポラリファイルの作成 5.13 章のまとめ 5.14 演習 6章 プロセス 6.1 プロセスとプログラム 6.2 プロセスIDと親プロセスID 6.3 プロセスのメモリレイアウト 6.4 仮想メモリ管理 6.5 スタックとスタックフレーム 6.6 コマンドラインパラメータ(argcとargv) 6.7 環境変数 6.8 グローバルジャンプ:setjmp()とlongjmp() 6.9 章のまとめ 6.10 演習 7章 メモリ割り当て 7.1 ヒープ上のメモリ割り当て 7.1.1 プログラムブレークの移動:brk()とsbrk() 7.1.2 ヒープ上のメモリ割り当て:malloc()とfree() 7.1.3 malloc()とfree()の実装 7.1.4 ヒープ上のメモリ割り当て:その他の方法 7.2 スタック上のメモリ割り当て:alloca() 7.3 章のまとめ 7.4 演習 8章 ユーザとグループ 8.1 パスワードファイル:/etc/passwd 8.2 shadowパスワードファイル:/etc/shadow 8.3 グループファイル:/etc/group 8.4 ユーザ情報とグループ情報の参照 8.5 パスワードの暗号化とユーザ認証 8.6 章のまとめ 8.7 演習 9章 プロセスの権限 9.1 実ユーザIDと実グループID 9.2 実効ユーザIDと実効グループID 9.3 set-user-IDとset-group-ID 9.4 saved set-user-IDとsaved set-group-ID 9.5 .lesystem user IDと.lesystemgroupID 9.6 追加グループID 9.7 プロセス権限の参照と変更 9.7.1 実ID、実効ID、saved set IDの参照と変更 9.7.2 filesystem user/group IDの参照と変更 9.7.3 追加グループIDの参照と変更 9.7.4 プロセス権限変更のまとめ 9.7.5 サンプルプログラム:プロセス権限の表示 9.8 章のまとめ 9.9 演習 10章 時間 10.1 カレンダ時間 10.2 時刻の変換 10.2.1 time_tの文字列変換 10.2.2 time_tとtm構造体の相互変換 10.2.3 tm構造体と文字列の相互変換 10.3 タイムゾーン 10.4 locale 10.5 システムの時計 10.6 ソフトウェアクロック(jif.es) 10.7 プロセス時間 10.8 章のまとめ 10.9 演習 11章 システムの制限とオプション機能 11.1 システムの制限 11.2 制限とオプション機能の参照 11.3 ファイル関連の制限とオプション機能の参照 11.4 未確定値 11.5 オプション機能 11.6 章のまとめ 11.7 演習 12章 システム情報とプロセス情報 12.1 /procファイルシステム 12.1.1プロセス情報の参照:/proc/PID 12.1.2 /proc下のシステム情報 12.1.3 /proc下のファイルへのアクセス 12.1.4 /proc/PID下のファイルへのアクセス 12.2 システムの識別:uname() 12.3 章のまとめ 12.4 演習 13章 I/Oのバッファリング 13.1 カーネルによるバッファリング:バッファキャッシュ 13.2 stdioライブラリによるバッファリング 13.3 カーネルバッファのフラッシュ 13.4 I/Oバッファリングのまとめ 13.5 アクセスパターンの通知 13.6 バッファリングを無効にする:DirectI/O 13.7 システムコールとライブラリ関数の混用 13.8 章のまとめ 13.9 演習 14章 ファイルシステム 14.1 デバイススペシャルファイル 14.2 ディスクとパーティション 14.3 ファイルシステム 14.4 i-node 14.5 VFS 14.6 ジャーナリングファイルシステム 14.7 ディレクトリツリーとマウントポイント 14.8 ファイルシステムのマウントとアンマウント 14.8.1 ファイルシステムのマウント:mount() 14.8.2 ファイルシステムのアンマウント:umount()とumount2() 14.9 高度なマウント 14.9.1 デバイスの複数マウント 14.9.2 マウントポイントへの複数マウント 14.9.3 マウント単位のオプションとマウントフラグ 14.9.4 bindマウント 14.9.5 再帰bindマウント 14.10 仮想メモリファイルシステム:tmpfs 14.11 ファイルシステム情報:statvfs() 14.12 章のまとめ 14.13 演習 15章 ファイルの属性 15.1 ファイル情報の取得:stat() 15.2 タイムスタンプ 15.2.1 ファイルタイムスタンプの変更:utime()とutimes() 15.2.2 タイムスタンプの変更:utimensat()とfutimens() 15.3 ファイルオーナ 15.3.1 新規ファイルのオーナ 15.3.2 ファイルオーナの変更:chown()、fchown()、lchown() 15.4 ファイルパーミション 15.4.1 通常ファイルのパーミション 15.4.2 ディレクトリのパーミション 15.4.3 パーミション検査アルゴリズム 15.4.4 アクセス可否の検査:access() 15.4.5 set-user-ID、set-group-ID、スティッキービット 15.4.6 ファイル作成マスク:umask() 15.4.7 パーミションの変更:chmod()とfchmod() 15.5 i-nodeフラグ(ext2の拡張ファイル属性) 15.6 章のまとめ 15.7 演習 16章 ファイルの拡張属性 16.1 概要 16.2 拡張属性の詳細 16.3 拡張属性の操作 16.4 章のまとめ 16.5 演習 17章 ACL 17.1 概要 17.2 ACL検査アルゴリズム 17.3 ACLのテキスト表現 17.4 ACL_MASKエントリとACLグループクラス 17.5 getfaclとsetfaclコマンド 17.6 ディフォルトACLとファイル新規作成 17.7 ACLの実装上の制限 17.8 ACLAPI 17.9 章のまとめ 17.10 演習 18章 ディレクトリとリンク 18.1 ディレクトリと(ハード)リンク 18.2 シンボリック(ソフト)リンク 18.3 (ハード)リンクの作成/削除:link()とunlink() 18.4 ファイル名の変更:rename() 18.5 シンボリックリンクの作成/参照:symlink()とreadlink() 18.6 ディレクトリの作成/削除:mkdir()とrmdir() 18.7 ファイルとディレクトリの削除:remove() 18.8 ディレクトリの読み取り:opendir()とreaddir() 18.9 ファイルツリーウォーク:nftw() 18.10 プロセスのカレントワーキングディレクトリ 18.11 検索開始ディレクトリと相対パス 18.12 プロセスのルートディレクトリの変更:chroot() 18.13 パス名の解決:realpath() 18.14 パス名の解析:dirname()とbasename() 18.15 章のまとめ 18.16 演習 19章 ファイルイベント 19.1 概要 19.2 inotifyAPI 19.3 inotifyイベント 19.4 inotifyイベントの読み取り 19.5 キューの上限と/procファイル 19.6 ファイルイベント監視の古い方法:dnotify 19.7 章のまとめ 19.8 演習 20章 シグナル:基礎 20.1 基礎概念と概要 20.2 シグナル種類とディフォルト動作 20.3 シグナル動作の変更:signal() 20.4 シグナルハンドラ 20.5 シグナルの送信:kill() 20.6 プロセスの存在確認 20.7 シグナル送信の他の方法:raise()とkillpg() 20.8 シグナルの説明文字列 20.9 シグナルセット 20.10 シグナルマスク(シグナルのブロック) 20.11 シグナルの保留 20.12 キューイングされないシグナル 20.13 シグナル動作の変更:sigaction() 20.14 シグナルを待つ:pause() 20.15 章のまとめ 20.16 演習 21章 シグナル:シグナルハンドラ 21.1 シグナルハンドラの設計 21.1.1 シグナルはキューイングされない(再考) 21.1.2 リエントラントと非同期シグナルセーフ 21.1.3 グローバル変数とsig_atomic_t型 21.2 シグナルハンドラの終了:他の方法 21.2.1 シグナルハンドラからのグローバルジャンプ 21.2.2 プロセスの異常終了:abort() 21.3 シグナル処理専用スタック:sigaltstack() 21.4 SA_SIGINFOフラグ 21.5 システムコールへの割り込みと再開 21.6 章のまとめ 21.7 演習 22章 シグナル:応用 22.1 コアダンプ 22.2 シグナル受信、シグナル動作、シグナル処理の特殊な例 22.3 プロセスの状態:割り込み可能/不可のスリープ 22.4 ハードウェアが生成するシグナル 22.5 シグナルの同期生成と非同期生成 22.6 シグナル受信のタイミングと順序 22.7 signal()の実装と可搬性 22.8 リアルタイムシグナル 22.8.1 リアルタイムシグナルの送信 22.8.2 リアルタイムシグナルの処理 22.9 シグナルマスクとシグナル待ち合わせ:sigsuspend() 22.10 同期的にシグナルを待つ 22.11 ファイルディスクリプタ経由のシグナル受信 22.12 シグナルを用いたプロセス間通信 22.13 太古のシグナルAPI(SystemVとBSD) 22.14 章のまとめ 22.15 演習 23章 タイマとスリープ 23.1 インターバルタイマ 23.2 スケジューリングとタイマ精度 23.3 ブロックする処理のタイムアウト設定 23.4 時間指定の実行停止(スリープ) 23.4.1 低解像度のスリープ:sleep() 23.4.2 高解像度スリープ:nanosleep() 23.5 POSIXクロック 23.5.1 クロック値の取得:clock_gettime() 23.5.2 クロック値の変更:clock_settime() 23.5.3 プロセス/スレッドごとのクロック 23.5.4 高精度のスリープ:clock_nanosleep() 23.6 POSIXインターバルタイマ 23.6.1 タイマの作成:timer_create() 23.6.2 タイマの開始と終了:timer_settime() 23.6.3 タイマ値の取得:timer_gettime() 23.6.4 タイマの削除:timer_delete() 23.6.5 シグナルによる通知 23.6.6 タイマオーバラン 23.6.7 スレッド起動による通知 23.7 ファイルディスクリプタ経由のタイマ通知:timerfd API 23.8 章のまとめ 23.9 演習 24章 プロセス作成 24.1 概要:fork()、exit()、wait()、execve() 24.2 プロセスの作成:fork() 24.2.1 親子プロセス間のファイル共有 24.2.2 fork()のメモリ処理 24.3 vfork()システムコール 24.4 fork()後の競合状態 24.5 シグナルによる同期を用いた競合状態防止 24.6 章のまとめ 24.7 演習 25章 プロセスの終了 25.1 _exit()とexit() 25.2 終了処理詳細 25.3 exitハンドラ 25.4 fork()とstdioバッファの関係 25.5 章のまとめ 25.6 演習 26章 子プロセスの監視 26.1 子プロセスの終了を待つ 26.1.1 wait()システムコール 26.1.2 waitpid()システムコール 26.1.3 wait()のstatus 26.1.4 シグナルハンドラからのプロセス終了 26.1.5 waitid()システムコール 26.1.6 wait3()とwait4()システムコール 26.2 孤児プロセスとゾンビプロセス 26.3 SIGCHLDシグナル 26.3.1 SIGCHLDハンドラの設定 26.3.2 子プロセスが一時停止した場合のSIGCHLD 26.3.3 終了した子プロセスの無視 26.4 章のまとめ 26.5 演習 27章 プログラムの実行 27.1 プログラムの実行:execve() 27.2 exec()ファミリ 27.2.1 環境変数PATH 27.2.2 パラメータリスト 27.2.3 親プロセスの環境を渡す 27.2.4 ファイルディスクリプタ指定によるプログラム実行:fexecve() 27.3 インタプリタのスクリプト 27.4 ファイルディスクリプタとexec() 27.5 シグナルとexec() 27.6 コマンド実行:system() 27.7 system()の実装 27.8 章のまとめ 27.9 演習 28章 プロセスの作成とプログラムの実行:詳細 28.1 プロセスアカウンティング 28.2 clone()システムコール 28.2.1 clone()のflags 28.2.2 clone()後にwaitpid()するための拡張フラグ 28.3 プロセス作成の速度性能 28.4 fork()とexec()がプロセス属性に与える影響 28.5 章のまとめ 28.6 演習 29章 スレッド:基礎 29.1 概要 29.2 Pthreads APIの基本事項 29.3 スレッドの作成 29.4 スレッドの終了 29.5 スレッドID 29.6 スレッドの終了を待つ 29.7 スレッドのデタッチ 29.8 スレッド属性 29.9 スレッドとプロセス 29.10 章のまとめ 29.11 演習 30章 スレッド:同期 30.1 共有変数の保護:mutex 30.1.1 スタティックに割り当てたmutex 30.1.2 mutexのロックとアンロック 30.1.3 mutexの性能 30.1.4 mutexのデッドロック 30.1.5 mutexのダイナミックな初期化 30.1.6 mutexの属性 30.1.7 mutexの種類 30.2 状態変化の通知:条件変数 30.2.1 スタティックに割り当てた条件変数 30.2.2 条件変数による通知と待機 30.2.3 条件変数が持つ意味 30.2.4 サンプルプログラム:終了したスレッドのjoin 30.2.5 ダイナミックに割り当てた条件変数 30.3 章のまとめ 30.4 演習 31章 スレッド:スレッドセーフと専用メモリ 31.1 スレッドセーフ(リエントラント再考) 31.2 ワンタイムイニシャライゼーション 31.3 スレッド固有データ 31.3.1 ライブラリ関数から見たスレッド固有データ 31.3.2 スレッド固有データAPI:概要 31.3.3 スレッド固有データAPI:詳細 31.3.4 スレッド固有データAPI:実例 31.3.5 スレッド固有データ実装上の制限 31.4 スレッドローカルストレージ 31.5 章のまとめ 31.6 演習 32章 スレッド:キャンセル 32.1 スレッドのキャンセル 32.2 キャンセル状態と種類 32.3 キャンセルポイント 32.4 キャンセル要求の検査 32.5 クリーンナップハンドラ 32.6 非同期キャンセル 32.7 章のまとめ 33章 スレッド:さらなる詳細 33.1 スレッドスタック 33.2 スレッドとシグナル 33.2.1 UNIXシグナルモデルとの整合 33.2.2 スレッドシグナルマスクの操作 33.2.3 スレッドへのシグナル送信 33.2.4 非同期シグナルへの対応 33.3 スレッド/プロセスの制御 33.4 スレッドモデル 33.5 LinuxのPOSIXスレッドライブラリ 33.5.1 LinuxThreads 33.5.2 NPTL 33.5.3 どちらのスレッドライブラリ? 33.6 Pthreads APIの先進機能 33.7 章のまとめ 33.8 演習 34章 プロセスグループ、セッション、ジョブコントロール 34.1 概要 34.2 プロセスグループ 34.3 セッション 34.4 制御端末と制御プロセス 34.5 フォアグラウンド/バックグラウンドプロセスグループ 34.6 SIGHUPシグナル 34.6.1 シェルのSIGHUP処理 34.6.2 SIGHUPと制御プロセスの終了 34.7 ジョブコントロール 34.7.1 ジョブコントロールの使用方法 34.7.2 ジョブコントロールの実装 34.7.3 ジョブコントロールシグナル 34.7.4 孤児プロセスグループ(SIGHUP再考) 34.8 章のまとめ 34.9 演習 35章 プロセスの優先度とスケジューリング 35.1 プロセスの優先度(nice値) 35.2 リアルタイムプロセススケジューリング 35.2.1 SCHED_RRポリシー 35.2.2 SCHED_FIFOポリシー 35.2.3 SCHED_BATCHポリシーとSCHED_IDLEポリシー 35.3 リアルタイムプロセススケジューリングAPI 35.3.1 リアルタイム優先度の範囲 35.3.2 ポリシーと優先度の設定/参照 35.3.3 CPUを手離す 35.3.4 SCHED_RRポリシーのタイムスライス 35.4 CPUアフィニティ 35.5 章のまとめ 35.6 演習 36章 プロセスのリソース 36.1 プロセスのリソース消費 36.2 プロセスのリソース消費制限 36.3 各リソース消費制限の詳細 36.4 章のまとめ 36.5 演習 37章 デーモン 37.1 概要 37.2 プロセスのデーモン化 37.3 デーモン化ガイドライン 37.4 SIGHUPによる再初期化 37.5 syslogによるログ出力 37.5.1 概要 37.5.2 syslog API 37.5.3 /etc/syslog.conf 37.6 章のまとめ 37.7 演習 38章 セキュアな特権プログラムの開発 38.1 set-user-IDとset-group-IDの必要性の再検討 38.2 最小の権限 38.3 外部プログラムの実行には細心の注意を 38.4 情報の機密保持 38.5 プロセスに課すセキュリティ上の制約 38.6 シグナルと競合状態 38.7 ファイル操作とファイルI/O時の落とし穴 38.8 ユーザ入力や環境を信頼してはいけない 38.9 バッファオーバラン予防策 38.10 DoSアタック対策 38.11 戻り値やエラーを確実に確認する 38.12 章のまとめ 38.13 演習 39章 ケーパビリティ 39.1 ケーパビリティの目的 39.2 Linuxのケーパビリティ 39.3 プロセスとファイルのケーパビリティ 39.3.1 プロセスケーパビリティ 39.3.2 ファイルケーパビリティ 39.3.3 プロセスのpermittedケーパビリティセットとeffectiveケーパビリティセット 39.3.4 ファイルのpermittedケーパビリティセットとeffectiveケーパビリティセット 39.3.5 プロセスのinheritableケーパビリティセットとファイルのinheritableケーパビリティセット 39.3.6 シェルからのファイルケーパビリティセットの設定と参照 39.4 現代のケーパビリティ実装 39.5 exec()とプロセスケーパビリティ 39.5.1 ケーパビリティバウンディングセット 39.5.2 root権限 39.6 ユーザID変更とプロセスケーパビリティ 39.7 プログラムからのプロセスケーパビリティ変更 39.8 ケーパビリティの作成(環境のみ) 39.9 プログラムに必要なケーパビリティの特定 39.10 ファイルケーパビリティ未対応のカーネルやシステム 39.11 章のまとめ 39.12 演習 40章 ログインアカウンティング 40.1 utmpファイルとwtmpファイル 40.2 utmpx API 40.3 utmpx構造体 40.4 utmpファイルとwtmpファイルの参照 40.5 ログイン名の参照:getlogin() 40.6 ログインセッションによるutmpおよびwtmpファイルの更新 40.7 lastlogファイル 40.8 章のまとめ 40.9 演習 41章 共有ライブラリ:基礎 41.1 オブジェクトライブラリ 41.2 スタティックライブラリ 41.3 共有ライブラリの概要 41.4 共有ライブラリの作成と使用−初めの一歩 41.4.1 共有ライブラリの作成 41.4.2 PIC 41.4.3 共有ライブラリの使用 41.4.4 共有ライブラリのsoname 41.5 共有ライブラリ関連ツール 41.6 共有ライブラリのバージョンと命名規則 41.7 共有ライブラリのインストール 41.8 ライブラリのバージョンアップと互換性 41.9 共有ライブラリの更新 41.10 オブジェクトファイルによるライブラリ検索パス指定 41.11 実行時共有ライブラリ検索 41.12 実行時シンボル解決 41.13 共有ライブラリをスタティックライブラリで置き換える 41.14 章のまとめ 41.15 演習 42章 共有ライブラリ:応用 42.1 ダイナミックロード 42.1.1 共有ライブラリのオープン:dlopen() 42.1.2 エラー診断:dlerror() 42.1.3 シンボル参照:dlsym() 42.1.4 共有ライブラリのクローズ:dlclose() 42.1.5 シンボルの情報:dladdr() 42.1.6 メインプログラム内のシンボルへのアクセス 42.2 シンボル公開の制御 42.3 リンカのバージョンスクリプト 42.3.1 シンボル公開の可否 42.3.2 シンボルのバージョン管理 42.4 初期化処理と終了処理 42.5 プリロード 42.6 ダイナミックリンカのトレース:LD_DEBUG 42.7 章のまとめ 42.8 演習 43章 プロセス間通信:概論 43.1 IPCの分類 43.2 通信機構 43.3 同期機構 43.4 IPCの比較 43.5 章のまとめ 43.6 演習 44章 パイプとFIFO 44.1 概要 44.2 パイプの作成と使用 44.3 パイプによるプロセス同期 44.4 パイプによるフィルタ連結 44.5 パイプとシェルコマンドの連結:popen() 44.6 パイプとstdioのバッファリング 44.7 FIFO 44.8 FIFOを用いたクライアント−サーバアプリケーション 44.9 ノンブロッキングI/O 44.10 パイプとFIFOのread()およびwrite() 44.11 章のまとめ 44.12 演習 45章 SystemVIPC:基礎 45.1 API概要 45.2 IPCキー 45.3 IPCオブジェクトの対応構造体とパーミション 45.4 IPC IDとクライアント−サーバアプリケーション 45.5 SystemVIPC getのアルゴリズム 45.6 ipcsコマンドとipcrmコマンド 45.7 全IPCオブジェクトの一覧 45.8 IPCの上限 45.9 章のまとめ 45.10 演習 46章 SystemVメッセージキュー 46.1 メッセージキューの作成とオープン 46.2 メッセージの交換 46.2.1 メッセージの送信 46.2.2 メッセージの受信 46.3 メッセージキューの制御 46.4 メッセージキューの対応構造体 46.5 メッセージキューの上限値 46.6 全メッセージキューの表示 46.7 メッセージキューによるクライアント−サーバアプリケーション 46.8 メッセージキューを用いたファイルサーバ 46.9 SystemVメッセージキューの短所 46.10 章のまとめ 46.11 演習 47章 SystemVセマフォ 47.1 概要 47.2 セマフォセットの作成とオープン 47.3 セマフォ制御 47.4 対応構造体 47.5 セマフォの初期化 47.6 セマフォ操作 47.7 複数セマフォ操作のブロック 47.8 セマフォのundo 47.9 バイナリセマフォの実装 47.10 セマフォの上限値 47.11 SystemVセマフォの短所 47.12 章のまとめ 47.13 演習 48章 SystemV共有メモリ 48.1 概要 48.2 共有メモリセグメントの作成とオープン 48.3 共有メモリの使用 48.4 サンプル:共有メモリによるデータ転送 48.5 仮想メモリ内での共有メモリ配置 48.6 共有メモリへのポインタ代入 48.7 共有メモリの制御 48.8 共有メモリ対応構造体 48.9 共有メモリの上限 48.10 章のまとめ 48.11 演習 49章 メモリマッピング 49.1 概要 49.2 マッピングの作成:mmap() 49.3 マッピングの削除:munmap() 49.4 ファイルマッピング 49.4.1 非共有ファイルマッピング 49.4.2 共有ファイルマッピング 49.4.3 マッピング範囲とページ境界 49.4.4 メモリ保護フラグとファイルアクセスモード 49.5 マッピング領域とファイルの同期:msync() 49.6 mmap()のその他のフラグ 49.7 無名マッピング 49.8 マッピングの再マップ:mremap() 49.9 MAP_NORESERVEとオーバコミット 49.10 MAP_FIXEDフラグ 49.11 非リニアマッピング:remap_file_pages() 49.12 章のまとめ 49.13 演習 50章 仮想メモリ操作 50.1 メモリ保護フラグの変更:mprotect() 50.2 メモリのロック:mlock()とmlockall() 50.3 ページ存在の検査:mincore() 50.4 メモリアクセスパターンのヒント:madvise() 50.5 章のまとめ 50.6 演習 51章 POSIX IPC:基礎 51.1 API概要 51.2 SystemVIPCとPOSIX IPCの比較 51.3 章のまとめ 52章 POSIXメッセージキュー 52.1 概要 52.2 メッセージキューのオープン、クローズ、削除 52.3 メッセージキューとディスクリプタの関係 52.4 メッセージキューの属性 52.5 メッセージの交換 52.5.1 メッセージの送信 52.5.2 メッセージの受信 52.5.3 メッセージ送受信のタイムアウト 52.6 新着メッセージ通知 52.6.1 シグナルによる通知 52.6.2 スレッド起動による通知 52.7 Linux固有の機能 52.8 メッセージキューの上限 52.9 POSIXメッセージキューとSystemVメッセージキューの比較 52.10 章のまとめ 52.11 演習 53章 POSIXセマフォ 53.1 概要 53.2 名前付きセマフォ 53.2.1 名前付きセマフォのオープン 53.2.2 名前付きセマフォのクローズ 53.2.3 名前付きセマフォの削除 53.3 セマフォ操作 53.3.1 セマフォの獲得 53.3.2 セマフォの解放 53.3.3 セマフォの現在値の参照 53.4 無名セマフォ 53.4.1 無名セマフォの初期化 53.4.2 無名セマフォの破棄 53.5 他の同期機構との比較 53.6 セマフォの上限 53.7 章のまとめ 53.8 演習 54章 POSIX共有メモリ 54.1 概要 54.2 共有メモリオブジェクトの作成 54.3 共有メモリオブジェクトの使用 54.4 共有メモリオブジェクトの削除 54.5 共有メモリAPIの比較 54.6 章のまとめ 54.7 演習 55章 ファイルロック 55.1 概要 55.2 flock()によるファイルロック 55.2.1 ロックの継承と解放 55.2.2 flock()の制限事項 55.3 fcntl()によるレコードロック 55.3.1 デッドロック 55.3.2 サンプル:インタラクティブなロックプログラム 55.3.3 サンプル:汎用ロック関数 55.3.4 ロックの上限と性能 55.3.5 ロックの継承と解放 55.3.6 スターベィションとキューイングされたロック要求の優先度 55.4 強制ロック 55.5 /proc/locks 55.6 プログラム実行を1インスタンスに制限する 55.7 従来のロック方法 55.8 章のまとめ 55.9 演習 56章 ソケット:基礎 56.1 概要 56.2 ソケットの作成:socket() 56.3 ソケットアドレスのバインド:bind() 56.4 汎用ソケットアドレス構造体:struct sockaddr 56.5 ストリームソケット 56.5.1 接続要求の受け付け:listen() 56.5.2 コネクションの受け付け:accept() 56.5.3 ピアソケットへの接続:connect() 56.5.4 ストリームソケットのI/O 56.5.5 コネクションの終了:close() 56.6 データグラムソケット 56.6.1 データグラムの交換:recvfrom()とsendto() 56.6.2 データグラムソケットのconnect() 56.7 章のまとめ 57章 ソケット:UNIXドメイン 57.1 UNIXドメインのソケットアドレス:struct sockaddr_un 57.2 UNIXドメインのストリームソケット 57.3 UNIXドメインのデータグラムソケット 57.4 UNIXドメインソケットのパーミション 57.5 接続済みソケットペアの作成:socketpair() 57.6 Linuxの抽象ソケット名前空間 57.7 章のまとめ 57.8 演習 58章 ソケット:TCP/IPネットワークの基礎 58.1 インターネット 58.2 ネットワークプロトコルとレイヤ 58.3 データリンク層 58.4 ネットワーク層:IP 58.5 IPアドレス 58.6 トランスポート層 58.6.1 ポート番号 58.6.2 UDP(UserDatagramProtocol) 58.6.3 TCP(TransmissionControlProtocol) 58.7 RFC(Request forComments) 58.8 章のまとめ 59章 ソケット:インターネットドメイン 59.1 インターネットドメインソケット 59.2 ネットワークバイトオーダ 59.3 データ表現 59.4 インターネットソケットアドレス 59.5 ホスト名およびサービス名変換関数の概要 59.6 inet_pton()とinet_ntop() 59.7 データグラムソケットのサンプル:クライアント−サーバプログラム 59.8 DNS(ドメインネームシステム) 59.9 /etc/services 59.10 ホスト名およびサービス名のプロトコルに依存しない変換 59.10.1 getaddrinfo() 59.10.2 addrinfoのアドレス構造体リストの解放:freeaddrinfo() 59.10.3 エラー診断:gai_strerror() 59.10.4 getnameinfo() 59.11 ストリームソケットのサンプル:クライアント−サーバプログラム 59.12 インターネットドメインソケットライブラリ 59.13 ホスト名とサービス名を変換する従来のAPI 59.13.1 inet_aton()とinet_ntoa() 59.13.2 gethostbyname()とgethostbyaddr() 59.13.3 getservbyname()とgetservbyport() 59.14 UNIXドメインソケットとインターネットドメインソケット 59.15 追加情報 59.16 章のまとめ 59.17 演習 60章 ソケット:サーバ設計 60.1 反復サーバと並行サーバ 60.2 UDP echo反復サーバ 60.3 TCP echo並行サーバ 60.4 並行サーバの他の設計 60.5 inetd(インターネットスーパサーバデーモン) 60.6 章のまとめ 60.7 演習 61章 ソケット:応用 61.1 ストリームソケットの部分読み取りと部分書き込み 61.2 shutdown()システムコール 61.3 ソケット専用I/Oシステムコール:recv()とsend() 61.4 sendfile()システムコール 61.5 ソケットアドレスの参照 61.6 TCPの詳細 61.6.1 TCPセグメントの形式 61.6.2 TCPのシーケンス番号と確認応答 61.6.3 TCPのステートマシンと状態遷移図 61.6.4 TCPコネクションの確立 61.6.5 TCPコネクションの切断 61.6.6 TCPソケットに対するshutdown() 61.6.7 TIME_WAIT状態 61.7 ソケットの監視:netstat 61.8 TCPトラフィックの監視:tcpdump 61.9 ソケットオプション 61.10 SO_REUSEADDRソケットオプション 61.11 accept()時のフラグとオプションの継承 61.12 TCP対UDP 61.13 高度な機能 61.13.1 帯域外データ 61.13.2 sendmsg()システムコールとrecvmsg()システムコール 61.13.3 ファイルディスクリプタの送受信 61.13.4 権限の送受信 61.13.5 シーケンスパケットソケット 61.13.6 トランスポート層:SCTPとDCCP 61.14 章のまとめ 61.15 演習 62章 端末 62.1 概要 62.2 端末属性の設定と参照 62.3 sttyコマンド 62.4 特殊文字 62.5 端末フラグ 62.6 端末のI/Oモード 62.6.1 canonicalモード 62.6.2 noncanonicalモード 62.6.3 cookedモード、cbreakモード、rawモード 62.7 端末回線速度(ビットレート) 62.8 端末回線制御 62.9 端末ウィンドウサイズ 62.10 端末の特定 62.11 章のまとめ 62.12 演習 63章 高度なI/Oモデル 63.1 概要 63.1.1 レベルトリガ通知とエッジトリガ通知 63.1.2 高度なI/OモデルでのノンブロッキングI/O 63.2 多重I/O 63.2.1 select()システムコール 63.2.2 poll()システムコール 63.2.3 I/O可能判定の要件 63.2.4 select()とpoll()の比較 63.2.5 select()とpoll()の問題点 63.3 シグナルドリブンI/O 63.3.1 I/O可能通知シグナルが送信されるのはいつか 63.3.2 シグナルドリブンI/Oの高度な使用 63.4 epoll API 63.4.1 epollインスタンスの作成:epoll_create() 63.4.2 epollインタレストリストの変更:epoll_ctl() 63.4.3 epollイベントを待つ:epoll_wait() 63.4.4 epoll動作の詳細 63.4.5 多重I/Oとepollの性能比較 63.4.6 エッジトリガ通知 63.5 シグナル待ちとファイルディスクリプタ待ち 63.5.1 pselect()システムコール 63.5.2 self-pipe 63.6 章のまとめ 63.7 演習 64章 疑似端末 64.1 概要 64.2 UNIX 98疑似端末 64.2.1 疑似端末マスタデバイスのオープン:posix_openpt() 64.2.2 スレーブデバイスのオーナおよびパーミションの変更:grantpt() 64.2.3 スレーブデバイスのアンロック:unlockpt() 64.2.4 スレーブデバイス名の取得:ptsname() 64.3 マスタデバイスのオープン:ptyMasterOpen() 64.4 疑似端末へのプロセスの接続:ptyFork() 64.5 疑似端末I/O 64.6 script(1)の実装 64.7 端末属性とウィンドウサイズ 64.8 BSD疑似端末 64.9 章のまとめ 64.10 演習 付録A システムコールのトレース 付録B コマンドラインの解析 付録C NULLポインタのキャスト演算 付録D カーネルコンフィギュレーション 付録E その他追加情報 付録F 演習の解答例(一部) 訳者あとがき 参考文献 索引