第1章 Cの復習(1):マニュアルの読み方,エラー処理,構造体,共用体 1 |
1.1 オンラインマニュアル(man)の読み方 1 |
1.1.1 manコマンド 1 |
1.1.2 SYNOPSISの読み方 2 |
1.1.3 よく分からないときはどうする? 5 |
1.2 エラー処理 7 |
1.2.1 エラー処理とは何か? 7 |
1.2.2 返り値でエラーの有無を調べる 7 |
1.2.3 errnoでエラーの原因を調べる 8 |
1.3 main関数の引数argcとargv 12 |
1.4 exit関数 13 |
1.5 構造体 14 |
1.5.1 構造体の復習 14 |
1.5.2 構造体同士の比較はできない 15 |
1.5.3 パデイングpaddig 16 |
1.6 共用体 22 |
1.6.1 共用体の復習 22 |
1.6.2 弁別子discriminator 23 |
1.7 章末問題 26 |
第2章 Cの復習(2):ポインタ,バイトオーダ,複雑な型 27 |
2.1 ポインタ 27 |
2.1.1 ポインタの復習 27 |
2.1.2 よくあるポインタの間違い 29 |
2.1.3 mallocとfree 34 |
2.1.4 メモリ関連のバグ 35 |
2.1.5 関数へのポインタ 37 |
2.1.6 ポインタをもっと理解するには? 38 |
2.2 バイトオーダbyte order 43 |
2.2.1 バイトオーダとは? 45 |
2.2.2 バイトオーダを確かめる(1) 46 |
2.2.3 バイトオーダを確かめる(2) 46 |
2.3 typedef 48 |
2.3.1 typedefの復習 48 |
2.3.2 typedefと構造体 48 |
2.3.3 システムデータ型 49 |
2.4 複雑な型 50 |
2.4.1 複雑な宣言の例 50 |
2.4.2 Cの宣言の読み方 51 |
2.4.3 例 : signalの型 51 |
2.5 ライブラリ関数とシステムコールの違い 53 |
2.6 ビット演算 54 |
2.7 可変長引数:stdarg.h 57 |
2.7.1 可変長引数とは何か? 57 |
2.7.2 可変長引数を持つ関数を呼び出す 58 |
2.7.3 可変長引数を持つ関数を定義する 59 |
2.8 章末問題 62 |
第3章 低水準入出力 63 |
3.1 UNⅨにおけるファイル 63 |
3.2 ファイル入出力の基本手順 64 |
3.3 ファイルを開く : open 65 |
3.4 ファイル記述子 66 |
3.5 ファイルを閉じる : close 67 |
3.6 ファイルから読む : read 68 |
3.7 ファイルに書く:write 71 |
3.8 ファイルの複製 73 |
3.9 標準入力,標準出力,標準エラー出力 75 |
3.10 位置決め : lseek 78 |
3.11 穴 81 |
3.12 電話帳プログラムを作る 83 |
3.12.1 試作プログラム1 83 |
3.12.2 試作プログラム2 85 |
3.13 ファイルを複数のプロセスで操作する場合 89 |
3.13.1 file構造体 89 |
3.13.2 ファイル操作の不可分性 92 |
3.13 3 不可分性を扱うプログラミング 94 |
3.14 ファイルモード作成マスク(umask) 95 |
3.15 ファイルを小さくする:truncate,ftruncate 97 |
5.16 ファイルに対する様々な操作:fcntl 98 |
3.17 エラー処理に関する補足 100 |
3.17.1 ブロックと遅いシステムコール 100 |
3.17.2 遅いシステムコールでのエラー処理 101 |
3.18 章末問題 102 |
第4章 標準入出力ライブラリ 105 |
4.1 ストリーム- 106 |
4.2 緩衝機能 108 |
4.2.1 緩衝機能の役割 108 |
4.2.2 緩衝方法の種類 109 |
4.2.3 緩衝機能の設定 : setbuf,setvbuf 109 |
4.3 標準入力,標準出力,標準エラー出力のストリーム 110 |
4.4 標準入出力ライブラリを使った読み書き 112 |
4.4.1 1文字ずつの読み書き 112 |
4.4.2 1行ずつの読み書き 115 |
4.4.3 ストリームのエラー処理 118 |
4.4.4 読んだ文字を戻す:ungetc 121 |
4.5 書式つき入出力 125 |
4.5.1 書式つき出力 125 |
4.5.2 書式つき入力 128 |
4.6 ストリームの位置決め 133 |
4.7 バイナリ入出力:fread,fwrite 134 |
4.8 標準入出力ライブラリを使う場合の注意 135 |
4.8.1 バッファの状態を意識する 135 |
4.8.2 ストリームとその下にあるファイル記述子とを意識する 137 |
4.8.3 読み書きモードのストリームにおける制限 137 |
4.8.4 テキストファイルとバイナリファイルの区別をするシステムについて 138 |
4.9 章末問題 139 |
第5章 プロセス 141 |
5.1 プロセスとプログラムの関係 142 |
5.2 環境変数 145 |
5.3 プロセスを終了する : exit 149 |
5.4 プロセスを作る : fork 150 |
5.5 親プロセスと子プロセスに別の動作をさせる 152 |
5.6 子プロセスが親プロセスから引き継ぐ情報 154 |
5.7 プログラムを実行する : exec 155 |
5.8 exec関数群の使い分け 157 |
5.9 シェルの動作 162 |
5.10 子プロセスを待つ : wait 163 |
5.11 背景実行 168 |
5.12 入出力切替 171 |
5.13 プロセスが作る才構造 176 |
5.14 章末問題 178 |
第6章 ファイルシステム 179 |
6.1 ファイルシステムの概略 180 |
6.1.1 経路名 180 |
6.1.2 ファイルの種類 182 |
6.1.3 ファイルの操作制御の原理 183 |
6.1.4 様々なユーザ識別子とグループ識別子 186 |
6.1.5 ユーザ識別子設定とグループ識別子設定 187 |
6.2 ファイルシステムの内部構造 190 |
6.2.1 iノード 190 |
6.2.2 ディレクトリとリンク 192 |
6.2.3 リンクの役割 194 |
6.2.4 シンボリックリンク 197 |
6.2.5 iノードとリンクで見たファイルシステム 199 |
6.3 ファイルシステムの操作 199 |
6.3.1 作業ディレクトリに関する操作 : getcwd,chdir,fchdir 200 |
6.3.2 ディレクトリの内容を読む 202 |
6.3.3 ディレクトリを書き換える:link,symlink,mkdirなど 206 |
6.3.4 ファイルの属性を得る:stat,lstat,fstat 210 |
6.3.5 ファイルの属性を変更する:chmod,chownなど 220 |
6.3.6 ファイルシステムに関するその他の操作 221 |
6.4 章末問題 222 |
第7章ファイル記述子のコピーとパイプ:dup,duP2,pipe 223 |
7.1 ファイル記述子のコピー:dup,dup2 223 |
7.1.1 ファイル記述子のコピーとは? 223 |
7.1.2 シェルのリダイレクションを実現する 224 |
7.1.3 dup 226 |
7.2 パイプ:pipe 227 |
7.2.1 パイプとは? 227 |
7.2.2 pipe(2)の使い方 228 |
7.2.3 シェルのパイプを作る 231 |
7.2.4 パイプの使用上の注意 234 |
7.3 コマンドを実行してパイプでつなぐ:popenとpclose 235 |
7.4 章末問題 240 |
第8章ソケット通信入門 241 |
8.1 クライアント・サーバ・モデル 241 |
8.2 用語 242 |
8.3 ソケットとは 242 |
8.4 ソケットを操作する関数 243 |
8.4.1 ソケットを作る : socket 244 |
8.4.2 ソケットに名前をつける : bind 245 |
8.4.3 ソケットで接続の受け付けを開始する : listen 247 |
8.4.4 クライアントからの接続を受け入れる : accept 248 |
8.4.5 ソケットに接続する : connect 249 |
8.4.6 ソケットの入出力を停止する : shutdown 250 |
8.4.7 ソケットを廃棄する 251 |
8.5 ネットワーク入出力に関する注意 251 |
8.6 簡単な通信プログラム 251 |
8.7 並行サーバ 256 |
8.8 入出力の多重化 : select 260 |
8.9 ホスト名からIPアドレスへの変換 : gethostbyname 265 |
8.10 ソケットを用いたその他のプロセス間通信 268 |
8.11 プロトコル独立なプログラム 269 |
8.12 章末問題 271 |
第9章シグナルと競合状態 273 |
9.1 ^Cとkillコマンド : 暴走したプロセスの強制終了 273 |
9.2 シグナルとは? 274 |
9.3 シグナルの種類とデフォルト動作 275 |
9.4 SIGALRM シグナルとalarm 278 |
9.5 シグナルハンドラの設定(1) : signal 280 |
9.6 例題:もく゛ら叩きゲームwhackamole.c 283 |
9.7 シグナル待機とシグナル送信 : pause,kill,raise 285 |
9.7.1 pauseはシグナルを待つ 285 |
9.7.2 killとraiseはシグナルを送信する 286 |
9.8 signalのどこがよくないのか? 290 |
9.9 シグナルハンドラの設定(2) : sigaction 292 |
9.10 シグナルのマスク(ブロック):sigpromask,sigsuspend 299 |
9.11 競合状態:シグナル処理が難しい理由 300 |
9.11.1 競合状態(1):シグナルのタイミング 300 |
9.11.2 競合状態(2):大域変数へのアクセス 302 |
9.11.3 シグナルハンドラ中で使うべきではない関数がある 311 |
9.12 waitせずにゾンビを避けたい 312 |
9.13 プロセスグループ,ジョブ制御,セッション,制御端末+ 312 |
9.13.1 プロセスグループ 312 |
9.13.2 ジョブとジョブ制御 316 |
9.13.3 セッション,制御端末 317 |
9.14 章末問題 320 |
第10章 端末(1)端末,端末ラインティシプリン,termios 構造体 321 |
10.1 端末=キーボード+ディスプレイ 321 |
10.2 端末処理の概要 322 |
10.3 端末 : 4つの身近な話題 323 |
10.3.1 エスケープシーケンスって何? 323 |
10.3.2 リターンキーを押さすにキー入力を得るには? 324 |
10.3.3 なせ^Cを押すとSIGINTか送信される? 326 |
10.3.4 scriptコマンドとteeコマンドの違いは何? 328 |
10.4 端末とデバイスファイル 330 |
10.5 端末ラインディシプリンとは何か? 332 |
10.5.1 端末ラインディシプリンの主な役割 332 |
10.5.2 端末の設定がおかしくなったら 333 |
10.6 termios 構造体 334 |
10.6.1 termios 構造体とは? 334 |
10.6.2 termios 構造体のプログラム例 336 |
10.6.3 特殊制御文字とフラグICANON とISIG 338 |
10.6.4 termios 構造体て用いるフラグのマクロ一覧 340 |
10.7 章末問題 346 |
第11章 端末(2)エスケープシーケンス,curses ライブラリ,擬似端末 347 |
11.1 エスケープシーケンスescape sequence 347 |
11.2 terminfo 349 |
11.3 curses ライブラリ 355 |
11.3.1 まずcurses を使ってみよう 355 |
11.3.2 curses ライブラリの使い方 356 |
11.3.3 curses ライブラリの主な関数 356 |
11.3.4 例題 : curses て倉庫番風ゲームを作ろう 357 |
11.4 擬似端末pseudo terminal 366 |
11.4.1 端末かどうかを意識する場合 366 |
11.4.2 擬似端末とは? 369 |
11.4.3 擬似端末のAPI 372 |
11.4.4 擬似端末のプログラム例 : pty.c 373 |
11.5 章末問題 377 |
第12章 非局所脱出 setjmp,longjmp 379 |
12.1 構造化プログラミングの教え : goto 文はなるべく使わない 379 |
12.2 非局所脱出とは? 380 |
12.3 setjmpとlongjmpの使い方(1) 381 |
12.4 setjmpとlongjmpの使用上の注意 383 |
12.5 setjmpとlongjmpの使い方(2) 386 |
12.6 sigsetjmp/siglongjmpとシグナル処理 388 |
12.7 setjmpとlongjmpの仕組み 392 |
12.8 章末問題 394 |
参考文献 395 |
用語集 397 |
索引 427 |
第1章 Cの復習(1):マニュアルの読み方,エラー処理,構造体,共用体 1 |
1.1 オンラインマニュアル(man)の読み方 1 |
1.1.1 manコマンド 1 |