著者より献本御礼。

内容が「Unix/Linuxプログラミング 理論と実践」のだけど、こちらはこちらで良著。「Unix/Linuxプログラミング 理論と実践」がクックブック的なら、こちらは「リャマ本」的な一冊となっている。

本書「例解Unixプログラミング教室」は、UnixプログラムをCで書くための教科書を目指して書かれた一冊。

目次 - 例解UNIXプログラミング教室 - 書籍紹介【和書】 Pearson Education Japanより。
第1章 C の復習(1):マニュアルの読み方,エラー処理,構造体,共用体
第2章 C の復習(2):ポインタ,バイトオーダ,複雑な型
第3章 低水準入出力
第4章 標準入出力ライブラリ
第5章 プロセス
第6章 ファイルシステム
第7章 ファイル記述子のコピーとパイプ:dup,dup2,pipe
第8章 ソケット通信入門
第9章 シグナルと競合状態
第10章 端末(1):端末,端末ラインディシプリン,termios 構造体
第11章 端末(2):エスケープシーケンス,curses ライブラリ,擬似端末
第12章 非局所脱出:setjmp, longjmp
参考文献
用語集

本書が優れている点は、以下のとおり。

用語をしっかりと定義している
なるべくカタカナを廃止、その代わり「ファイル記述子 File Descriptor」という形できちんと英語表記も示している。ただ、プログラマー通しの会話では通じなくなるそれを徹底しているというのはどうなのだろうか。例えば「行緩衝」と言われてもピンと来るだろうか。
とはいえ、著者たちはその理由もきちんとコラムで説明している(いささかしつこいほど)。このコラムは、Unixプログラマーだけではなく技術書を書く人には是非目を通していただきたい。
きちんとCを復習している
本書では、実際のUnixプログラミングに入る前に、Cを一通り復習している。例えばint (*compar)(const void *, const void *)をどう読んだらよいのかも、本書を読めばきちんとわかる。
章立てが難易度順である
教科書としての構成を考えれば当然であるが、基礎から一歩一歩足場を固めて進みたいタイプの人は、「Unix/Linuxプログラミング理論と実践」よりもこちらの方がしっくり来るだろう。
書籍Webが充実している
というより、これに関しては「Unix/Linuxプログラミング理論と実践」がしょぼすぎるというべきだろう。出版社のページだけではなく、著者ページもきちんとあって、コードサンプルをダウンロードすることが出来る。
比較的安価である
定価3,990円は、この手の本としては悪くない値段だ。「例解UNIXプログラミング教室」一冊の値段で本書と「小飼弾のアルファギークに逢ってきた」を一緒に買ってもおつりが来ます:)

というわけでなかなかの好著なのだが、一つ気になったところがある。それは、コードそのもの。

本書は教科書を狙っているだけあって、文章や構成は実に周到に書かれているのだが、それだけにコードがよけい甘く感じられる。例えば本書では折角最初にperrorerrnoを紹介しているのに、

if (something_is_wrong){
  fprintf(stderr, "Error message here.\n");
  exit(1);
}

みたいな処理が随所に現れる。なんでerrorを紹介しているのにexitコードがいつも1なのか。これはerrnoを返すべきだろう。それに、エラー処理だけで3行食ってしまうのはもったいない。

int die(const char *msg){
    if (errno){
        perror(msg);
        exit(errno);
    }else{
        fprintf(stderr, "%s\n", msg);
        exit(255);
    }
    return -1; /* never comes here but this makes cc happy */
}

のような関数を共通ファイルに定義した上で#includeして、

if (something_is_wrong) die("message here.");

とした方がよかったのではないか。また、やや悪趣味ではあるが、上のようにdie()を定義しておけば

unlink(file) && die(file);

としてもちゃんとコンパイルする(voidでなくてintなのはそのため)。

あと、fopen()の返り値をチェックしていない箇所を見つけたので報告させていただく。(P. 358)

とはいえ、これらの問題は、本書の特長を考えれば実に些細である。UnixでCプログラミングを学び直したい方にも、CでUnixプログラミングを学ぶ方にも薦められる一冊だ。

Dan the Occasional C Programmer