Ubuntu 12.04時代のファイルシステムの選び方 ext4でいいじゃん編

※2013年1月3日、ext2/3/4を更新。

※2012年11月14日、NTFSの欠点を追加。



行っとけ! Ubuntu道場! ― 第55回 〜師範、Ubuntu 12.04の特徴を教えてください!〜

↑の記事の3ページ目にXFSのことが書いてあった。

hito:むしろXFSが安心して使えるようになることの方が大きいかなぁ。 

hito:XFSって、わりとメモリ食うんですよ。
      で、システム内のメモリがなくなってきたりするとですね……。
      Linux全般でどんな挙動になるでしょう、そこのやまねさん。 

やまね:キャッシュやバッファを始末するために、
        メモリ上に貯めてるものを「追い出す」動作がかかるね。 

hito:で、その「追い出す」先がXFSだったりするわけですね。 

hito:そうすると何が起こるかっつーと、
      「メモリが足りない→XFS領域にデータを書きだそうとする→XFSがメモリを要求する」という……。 

hito:で、そういう挙動はダメだよねーっていう修正がやっと入った。6〜7年ぐらいかかってると思う。
      まあXFSにはもっと前にスタック使い尽くす問題とかもあったんで、
      やっとこさヘビーな使い方ができるかなーという感じ。 

XFSの問題点の話になると、xfs stack overflowが引き合いに出されていたような気がするが、このバグがマシになったという事なのだろうか。

この記事を読んで、Linuxファイルシステムはどれを使えばいいのかを改めて考えてみた。ファイルシステムに関する詳しい知識が無い私の、現時点での印象を纏めると以下のような感じになる。

名前 印象 利点 欠点
Btrfs

開発中

不安定

遅い

ext2

古い

速い

Ext2Fsdを使えばWindowsからアクセスできる

削除したファイルを復元できる(R-Linux

古い

fallocate非対応

ext3

枯れてる

速度はそこそこ

Ext2Fsdを使えばWindowsからアクセスできる

削除したファイルを復元できる(Ext4magicR-Linuxextundelete

fsckが遅い

fallocate非対応

ext4

全体的に結構速そう

バグ多そう

Ext2Fsdを使えばWindowsからアクセスできる

削除したファイルを復元できる(Ext4magicR-Linuxextundelete

色んなディストリのデフォルトファイルシステムなので安心感がある

サイズの小さいファイルは結構断片化しにくい

fallocate対応

デフラグツールがある

ext3よりfsckが速くなっているが、それでも容量が増えると時間がかかる

128MBを超えるような大きなファイルを対象としたfallocateの性能がイマイチで断片化しまくり

遅延確保の性能がイマイチなので大きなファイルは断片化しまくり

JFS
NTFS

共有用

倉庫用

Linuxからも読み込めるし、書き込める

Linuxから書き込むのは今でも何かちょっと不安

Linuxからだと読み書きの速度がちょっと遅い

ReiserFS 枯れてる サイズの小さいファイルに強いらしい? 今あえてコレを選ぶ理由が分からない
Reiser4 ext3よりは速いらしい
XFS

倉庫用

バグ多そう

サイズの大きなファイルに強い

シーケンシャルアクセスが速い

ファイルが断片化しにくい

fallocate対応かつ精度が高い

デフラグツールがある

ダイレクトI/Oの性能が良い

削除したファイルは復元不可能らしい

ランダムアクセスが遅いらしい

ファイルやフォルダの作成/削除が遅いらしい

nfsと組み合わせると駄目とかいうのどこかで見た気がする。もう直ってるかもしれないが。

クラッシュ時の復旧が難しそう

削除したファイルは復元不可能らしい

で、どんな人がどのファイルシステムを使うべきなのか考えるとこうなる。

対象 ファイルシステム
新しもの好き Btrfs
安定志向 ext2ext3
デフォルトのでいいじゃん派 ext4
マルチブート派 NTFS
断片化嫌い
デフラグ好き
128MBよりも大きなファイルを沢山持っている人
XFS
上級者 Btrfs/JFS/NTFS/ReiserFS/Reiser4/XFS

やっぱext4は最強だわ。私は/とバックアップ用外付けHDDはext4、ローカルのデータ置き場はXFSにしようと思う。ってかしてる。あとタイトルは釣り。

Ubuntu 12.04でデフラグする(e4defrag編)

※2012年9月28日、間違えていた部分を修正。Thanks!、id:omasanoriさん。



Ubuntu 12.04からe4defragというext4用のデフラグツールが利用できるようになった。

$ e4defrag
Usage	: e4defrag [-v] file...| directory...| device...
	: e4defrag  -c  file...| directory...| device...

デバイスも対象に出来るらしい。

-vオプションを付けると、extentsがいくつに減ったか表示される。

-cは断片化状況を表示するオプションで、sudoと-vと一緒に使う。

e4defragはfake-defragと同じくfallocateを使用している。Ubuntu 12.04では11.10にあったfallocateのバグは修正されているようだが、精度が11.04の頃並に低下しているので、断片化を完全に解消することは難しいような気がする。

-cを付けてファイルを対象に実行すると、次のように表示される。

$ sudo e4defrag -cv ubuntu-12.04-beta2-desktop-amd64.iso.bak 
<File>
[ext 1]:	start 36286464:	logical 0:	len 12288
[ext 2]:	start 36319232:	logical 12288:	len 2048

※長いので省略

[ext 30]:	start 36945920:	logical 176128:	len 2048
[ext 31]:	start 36944933:	logical 178176:	len 843

 Total/best extents				31/1
 Average size per extent			23099 KB
 Fragmentation score				0
 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
 This file (ubuntu-12.04-beta2-desktop-amd64.iso.bak) does not need defragmentation.
 Done.

断片化の数スコアが0〜30、31〜55だとデフラグの必要が無く、56以上だとデフラグが必要と言われるらしい。

それをデフラグするとこうなる。

$ sudo e4defrag -v ubuntu-12.04-beta2-desktop-amd64.iso.bak 
ext4 defragmentation for ubuntu-12.04-beta2-desktop-amd64.iso.bak
[1/1]ubuntu-12.04-beta2-desktop-amd64.iso.bak:	100%  extents: 31 -> 25	[ OK ]
 Success:			[1/1]

extentsの数が31から25に減った。なんという低性能。無いよりマシだけど、これはひどいと言わざるを得ない。

readの正しい使い方、writeの正しい使い方

※2012年5月2日、追記。

下記のコードよりもcopybenchのコードを参考にした方がいいかもしれない。



C言語: write(2)の正しい使い方というページがあったのだが、今は見ることが出来なくなっているので、似たような内容を残しておくことにした。

正しい使い方とはつまり、システムコールは割り込まれて中断することがあるからちゃんとエラーチェックをしましょう、ということだ。

以下に、writeを使用するためのソースコードを転載する。

/* http://www.koders.com/c/fidBA4A85F16684724E234A9F3D52154B6A3EE76852.aspx?s=md5 */

ssize_t full_write(int fd, const void *buf, size_t len)
{
	ssize_t cc;
	ssize_t total;

	total = 0;

	while (len) {
		cc = safe_write(fd, buf, len);

		if (cc < 0)
			return cc;	/* write() returns -1 on failure. */

		total += cc;
		buf = ((const char *)buf) + cc;
		len -= cc;
	}

	return total;
}

/* http://www.koders.com/c/fid1D28BE2FE0F7496591C635321BDFC406ED821089.aspx?s=md5 */

ssize_t safe_write(int fd, const void *buf, size_t count)
{
	ssize_t n;

	do {
		n = write(fd, buf, count);
	} while (n < 0 && errno == EINTR);

	return n;
}

readも同じような処理が必要なので、以下のような関数を使う。

/* http://www.koders.com/c/fidE71B6BE5B9B1AE1265F1CFBA2DB698715258B0F5.aspx?s=ftp */

int full_read(int fd, char *buf, int len)
{
	int cc;
	int total;

	total = 0;

	while (len > 0) {
		cc = read(fd, buf, len);

		if (cc < 0)
			return -1;

		if (cc == 0)
			break;

		buf += cc;
		total += cc;
		len -= cc;
	}

	return total;
}

/* http://www.koders.com/c/fidA918F638FF7469723CAC99A84826115C1310BC35.aspx?s=ftp */

ssize_t safe_read(int fd, void *buf, size_t count)
{
	ssize_t n;

	do {
		n = read(fd, buf, count);
	} while (n < 0 && errno == EINTR);

	return n;
}

ネットワークアプリケーションの場合は、さらにSIGPIPEシグナルを無視する処理が必要らしい。

関連:Programming UNIX Sockets in C - Frequently Asked Questions

Ubuntu 10.10 + Fierfox 4.0 beta 11 + Flash Player 10.2 で、ニコニコ動画の動画ファイルを保存する

今まではYouTubeニコニコ動画などのFlashを使用した動画サイトのキャッシュは /tmp に保存されていたのだが、Flash Player 10.2からは別の場所(キャッシュフォルダかな?)に保存されるようになったらしい。

とりあえず代替手段として、LinuxFirefox 4.0にも対応しているVideo DownloadHelper 4.8.2をインストールして使ってみたところ、保存はできた。キャッシュからコピーするんじゃなくてダウンロードし直しているっぽい点とか、設定の Services > Download > 保存ディレクトリのディレクトリを変更するボタンが正常に動作しない辺りが気になるが。

関連:Flash Player 10.2 のキャッシュファイルをゲットする

Ubuntu 10.10で4096バイトセクタなHDDをフォーマットする場合

※2011年4月15日、修正。

関連:Ubuntu 10.10のpartedでGPTったメモ

ドスパラの製品レビューを見たら良さ気だったので、Seagate ST2000DL003を購入してみた。ディスク・ユーティリティ(Palimpsest)でフォーマットしてみたところ、以下のようになった。

sudo fdisk -lu /dev/sdc
[sudo] password for : 

ディスク /dev/sdc: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000314cb

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1              63  3907024064  1953512001   83  Linux

始点が63バイト63セクタになっている。どうやらディスク・ユーティリティはまだAdvanced Format Technologyに対応していないらしい。この状態だとフォーマット時の書き込み速度が30MB/sぐらいにまで落ちる。GPartedだと以下のようになる。

sudo fdisk -lu /dev/sdc

ディスク /dev/sdc: 2000.4 GB, 2000398934016 バイト
ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0003db79

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1            2048  3702228991  1851113472   83  Linux
/dev/sdc2      3702228992  3906619391   102195200   83  Linux
/dev/sdc3      3906619392  3907028991      204800    5  拡張領域

始点が2048バイト2048セクタになっている。これだと普通に速い。これやWD20EARSなどの4Kセクターを採用したHDDをLinuxでフォーマットする場合は、fdiskかpartedかGPartedを使えばいいってことか。

関連:Seagate ST2000DL003に論理パーティションを作成しようとしてエラー

※2011年1月23日追記。ST2000DL003の新ファームウェアが公開された。Barracuda Green Firmware Update [218171]

C言語でファイルをコピーする(マルチスレッド&ダイレクトI/O編)

※2012年8月9日、追記。普通のファイルコピーのソースが見たい場合はcopybenchのソースが参考になると思う。このページの内容はやや古くなっているうえ、ソースコードの質が低いので注意。

そこに至る経緯。

  1. mmapが速いらしいと知ってググる
  2. ファイルコピーだとmmapよりread/writeの方が早い、という事を知る。
  3. copybench-1.0をちょっと弄ってO_DIRECT使うようにしたら読み書きの速度が2/3程度にまで落ちた。
  4. 試しにreadだけやったらごっつ早い(つまりwriteが遅い?)
  5. 何となくpthread使ったら速度改善(゚∀゚)

シングルスレッドだと遅いのかな?よく分からん。

参考:C言語: UNIX最速ファイルコピー

参考:C言語: write(2)の正しい使い方

関連:C言語でフォルダ(ディレクトリ)を丸ごとコピーする

/*
gcc -Wall -std=c99 `pkg-config --cflags --libs glib-2.0` -lpthread -O -o cp_thread_dio cp_thread_dio.c
*/

#define _XOPEN_SOURCE 600
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE

#define IO_BUF 16777216
#define PATH_LEN 8192

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <utime.h>

#include <glib.h>
#include <pthread.h>

char *buf1; /*ファイルを読み書きする際のバッファ*/
char *buf2;
int rcount_1 = -1;
int rcount_2 = -1;
int wcount_1 = -1;
int wcount_2 = -1;
int woffset = 0;

void * r_func1(void *read_tmp)
{
  rcount_1 = read(*(int *)read_tmp, buf1, IO_BUF);

  if(rcount_1 == -1)
  {
    perror("r_func1");
    exit(-1);
  }

  return NULL;
}

void * w_func1(void *write_tmp)
{
  if(rcount_1 == IO_BUF)
  {
    wcount_1 = pwrite(*(int *)write_tmp, buf1, rcount_1, woffset);
    woffset += rcount_1;

    if(wcount_1 == -1)
    {
      perror("w_func1");
      exit(-1);
    }

    printf("wcount_1 : %d\n", wcount_1);
    printf("woffset : %lld\n", (long long)lseek(*(int *)write_tmp, woffset, SEEK_SET));
  }
  else
  {
    wcount_1 = pwrite(*(int *)write_tmp, buf1, (rcount_1 - (rcount_1 % 512)) + 512, woffset);
    woffset += rcount_1;

    if(wcount_1 == -1)
    {
      perror("w_func1");
      exit(-1);
    }

    printf("wcount_1 : %d\n", wcount_1);
    printf("woffset : %lld\n", (long long)lseek(*(int *)write_tmp, woffset, SEEK_SET));
  }

  return NULL;
}

void * r_func2(void *read_tmp)
{
  rcount_2 = read(*(int *)read_tmp, buf2, IO_BUF);

  if(rcount_2 == -1)
  {
    perror("r_func2");
    exit(-1);
  }

  return NULL;
}

void * w_func2(void *write_tmp)
{
  if(rcount_2 == IO_BUF)
  {
    wcount_2 = write(*(int *)write_tmp, buf2, rcount_2);
    woffset += rcount_2;

    if(wcount_2 == -1)
    {
      perror("w_func2");
      exit(-1);
    }

    printf("wcount_2 : %d\n", wcount_2);
    printf("woffset : %lld\n", (long long)lseek(*(int *)write_tmp, woffset, SEEK_SET));
  }
  else
  {
    wcount_2 = pwrite(*(int *)write_tmp, buf2, (rcount_2 - (rcount_2 % 512)) + 512, woffset);
    woffset += rcount_2;

    if(wcount_2 == -1)
    {
      perror("w_func2");
      exit(-1);
    }

    printf("wcount_2 : %d\n", wcount_2);
    printf("woffset : %lld\n", (long long)lseek(*(int *)write_tmp, woffset, SEEK_SET));
  }

  return NULL;
}

void read_write(const char *from, const char *target_file)
{
  struct stat stat_buf;
  //今回はutimensatを使わない
  struct utimbuf times;
  pthread_t t1;
  pthread_t t2;
  int ifrom = open(from, O_RDONLY | O_DIRECT | O_NOATIME);
  int ito   = open(target_file, O_RDWR | O_CREAT | O_DIRECT, S_IRUSR | S_IWUSR);

  rcount_1 = read(ifrom, buf1, IO_BUF);

  for(;;)
  {
    pthread_create(&t1, NULL, r_func2, (void *)&ifrom);
    pthread_create(&t2, NULL, w_func1, (void *)&ito);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    if((rcount_1 == 0) || (rcount_2 == 0)) break;

    pthread_create(&t1, NULL, r_func1, (void *)&ifrom);
    pthread_create(&t2, NULL, w_func2, (void *)&ito);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    if((rcount_1 == 0) || (rcount_2 == 0)) break;
  }

  fstat(ifrom, &stat_buf);
  ftruncate(ito, stat_buf.st_size);

  times.actime  = stat_buf.st_atime;
  times.modtime = stat_buf.st_mtime;
  utime(target_file, &times);

  rcount_1 = -1;
  rcount_2 = -1;
  wcount_1 = -1;
  wcount_2 = -1;
  woffset = 0;

  close(ifrom);
  close(ito);
}

int main(int argc, char *argv[])
{
  char current_dir[PATH_LEN];
  char from[PATH_LEN];
  char to[PATH_LEN];
  char *from_basename;
  char *target_file;

  if(argc == 3)
  {
    if(g_file_test(argv[1], G_FILE_TEST_IS_REGULAR))
    {
      if(g_file_test(argv[2], G_FILE_TEST_IS_DIR))
      {
        if((realpath(argv[1], from) == NULL) || (realpath(argv[2], to) == NULL))
        {
          puts("絶対パスの作成に失敗しました");
          exit(-1);
        }

        getcwd(current_dir, sizeof(current_dir));
        printf("cwd is : %s\n", current_dir);
        printf("from   : %s\n", from);
        printf("to     : %s\n", to);

        //buf1 = malloc(IO_BUF);
        //buf2 = malloc(IO_BUF);
        posix_memalign((void *)&buf1, 512, IO_BUF);
        posix_memalign((void *)&buf2, 512, IO_BUF);

        chdir(to);

        from_basename = g_path_get_basename(from);
        target_file = g_build_path(G_DIR_SEPARATOR_S, to, from_basename, NULL);

        read_write(from, target_file);
      }
    }
  }

  else
  {
    puts("引数が正しくありません");
  }

  free(buf1);
  free(buf2);

  return 0;
}

C言語を独学で習得するのに適した入門書を探してまとめてみた件について

※2017年11月8日、「やさしいC 第5版」「かんたん C言語」「ふつうのLinuxプログラミング」「C言語による スーパーLinuxプログラミング」「モダンC言語プログラミング」のリンクを修正。

Amazonで評判が良い本を、発売日順に並べてみた。



入門書

C言語改訂版1、2』を読んだ後に『独習C』を読めばだいたい理解できると思う。


価格2,700円
高橋麻奈さんの本はどれも分かりやすい(『やさしいJava』とか、『やさしいXML』とか)。ただし内容は薄いので、他のプログラミング言語をちょっとでも囓ったことがある人には向かないかも。
  • 第2版を購入済み。


プログラミング学習シリーズ C言語改訂版 1 はじめてのCプログラミング

プログラミング学習シリーズ C言語改訂版 1 はじめてのCプログラミング

プログラミング学習シリーズ C言語改訂版 2 はじめて学ぶCの仕組み

プログラミング学習シリーズ C言語改訂版 2 はじめて学ぶCの仕組み

価格2,030円
絵が多く分かりやすい。改訂前の時点でもenumの解説が良いと言われていたらしい。
  • 2のみ購入済み。


独習C 第4版

独習C 第4版

価格3,456円
C言語に慣れるための問題集。2冊目以降に。
  • 購入済み。


価格2,484円
Amazonでの評判は上々。このシリーズは他にも中級編などが出ているので、まとめてやるといいかも。


かんたん C言語

かんたん C言語

価格2,678円




脱 初心者

C言語ポインタ完全制覇』は必読、『CプログラミングFAQ』も買うべき、『エキスパートCプログラミング』を理解できれば中級者?


C言語教科書(上達編) 誰でもわかる! C言語ベテラン技

C言語教科書(上達編) 誰でもわかる! C言語ベテラン技

価格3,024円
ビット演算子の章を読んでみたかったので購入。C言語の落とし穴や小技などの解説本。日本語環境特有の問題を取り上げている点も良い。この著者の本を買うのは二冊目だが、読みやすくていい。ただ後半の150ページ以上がC99のリファレンスになっている点が微妙。簡潔にまとめられていてVC++ 2008でコンパイルできるかどうか書かれているのはいいが、その部分を削ってもうちょっと値段を安くしてほしかった気もする。
  • ※2017年2月20日、いつの間にか絶版になっている。


新・解きながら学ぶC言語

新・解きながら学ぶC言語

価格2,160円


新版 明解C言語 中級編

新版 明解C言語 中級編

価格2,592円


C言語逆引き大全500の極意

C言語逆引き大全500の極意

価格 -
広く浅くなtips集。tips一つ一つは短いのでサクサク読める(一部長いのもあるが)。分厚い割に安い。
  • 購入済み。
    • ※2014年8月23日、いつの間にか絶版になっている。


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

価格2,462円
ポインタ理解のための必読書。
  • 購入済み。


CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 (新紀元社情報工学シリーズ)

CプログラミングFAQ―Cプログラミングのよく尋ねられる質問 (新紀元社情報工学シリーズ)

価格 -
絶版になっているのが惜しい。古い部分も多いが読んで損無し。
  • 購入済み。


エキスパートCプログラミング―知られざるCの深層 (Ascii books)

エキスパートCプログラミング―知られざるCの深層 (Ascii books)

価格 -
読み物。内容はやや古い部分があるが面白い本(面白いけど、読んでも理解できない部分が多数あった。特にAppendixの内容は難しすぎて…)。
  • 購入済み。
    • ※2013年11月24日、いつの間にか絶版になっている。




アルゴリズム


新・明解C言語によるアルゴリズムとデータ構造

新・明解C言語によるアルゴリズムとデータ構造

価格2,700円
  • 旧版の方を購入済み。


プログラミングの宝箱 アルゴリズムとデータ構造 第2版

プログラミングの宝箱 アルゴリズムとデータ構造 第2版

価格3,024円


珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造

価格3,672円


定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

定本 Cプログラマのためのアルゴリズムとデータ構造 (SOFTBANK BOOKS)

価格2,916円


C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

価格2,516円
色んなコードが一杯載ってる。ウェブでサンプルコードをダウンロードできるのも良い。
  • 購入済み。


アルゴリズムとデータ構造 (岩波講座 ソフトウェア科学 3)

アルゴリズムとデータ構造 (岩波講座 ソフトウェア科学 3)

価格4,212円




リファレンス

辞書的に使える本は一冊ぐらい持っておきたい。


C言語逆引きハンドブック

C言語逆引きハンドブック

  • 作者: 林晃
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2011/10/12
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 2回
  • この商品を含むブログを見る
価格3,240円
WindowsMacLinuxと、三つのOSに対応しているらしい。


C言語標準ライブラリ関数 ポケットリファレンス [ANSI C、ISO C99 対応] (POCKET REFERENCE)

C言語標準ライブラリ関数 ポケットリファレンス [ANSI C、ISO C99 対応] (POCKET REFERENCE)

価格2,462円
  • ※2016年10月15日、いつの間にか絶版になっている。


S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

  • 作者: 3世,サムエル・P.ハービソン,ガイ・L.,ジュニアスティール,3,Samuel P. Harbison,Guy L.,Jr. Steele,玉井浩
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2008/10/01
  • メディア: 単行本
  • 購入: 9人 クリック: 110回
  • この商品を含むブログ (20件) を見る
S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル

  • 作者: 3世,サムエル・P.ハービソン,ジュニア,ガイ・L.スティール,3,Samuel P. Harbison,Jr.,Guy L. Steele,玉井浩
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2015/04/01
  • メディア: 単行本
  • この商品を含むブログを見る
価格6,048円
Cのバイブルと言われているK&Rを凌駕する良書、らしい。内容が濃すぎて日曜プログラマにはもったいない気もするが、買って損はない。値段が少々高いのが難点。2015年にオンデマンド版が出ていたらしい。
  • 購入済み。


プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠

価格3,024円
通称K&R。賛否両論のCのバイブル。今となっては古い部分もあるので初心者が読む本じゃない、らしい。




Linuxプログラミング

まず『ふつうのLinuxプログラミング』、次に『例解UNIXプログラミング教室』、これで基礎は身につくと思う。『Linuxシステムプログラミング』は良書。『詳解UNIXプログラミング』は値段が気にならなければ買うべき?


価格2,970円
読みやすい、Linuxプログラミングの入門書。
  • 購入済み。
    • ※2017年11月8日、第二版が出たらしい。


詳解UNIXプログラミング 第3版

詳解UNIXプログラミング 第3版

価格8,964円
名著の第3版。


Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

価格8,208円
Linuxプログラマーは『詳解UNIXプログラミング』ではなくこちらを買うべき?


価格1,836円
それほどスーパーではないらしい?初級者がレベルアップするための本だとか。


Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

価格3,420円


入門GTK+

入門GTK+

価格 -
gtk2の入門書。
  • 購入済み。
    • ※2016年10月15日、いつの間にか絶版になっている。GTK+3版を執筆中とのこと。


Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック)

Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック)

価格 -
初心者向け。よく使われると思われる基本的なシステムコールの解説。突っ込んだ内容は無し(例えばopenの項目ではO_CLOEXECやO_DIRECTには触れていない、readaheadやposix_fadviseのようなシステムコールは載ってない、pollは載ってるがepollは無し、など)。
  • 購入済み。
    • ※2016年10月15日、いつの間にか絶版になっている。


Unix/Linuxプログラミング理論と実践

Unix/Linuxプログラミング理論と実践

価格
『ふつうのLinuxプログラミング』より突っ込んだ内容。だが『ふつうの〜』には載っていてこっちには載ってない例があるので両方読むべき。内容はそれほど難しくなく、使用しているシステムコールは基本的なものが大半。C言語本というよりUnixの基礎解説本といった感じ。内容が『例解UNIXプログラミング教室』と被ってるような気もする。サンプルコードが原著のサイトにしか無い点がマイナス。高くて、分厚くて、重い。
  • 購入済み。
    • ※2016年10月15日、いつの間にか絶版になっている。


Linuxシステムプログラミング

Linuxシステムプログラミング

価格3,888円
I/Oやメモリ・プロセス管理などに的を絞った、イラストの類がほぼ無い硬派な良著。mmapやreadvなど初心者が使わないシステムコールの解説有り。スレッドの解説がないのが残念。
  • 購入済み。


例解UNIXプログラミング教室

例解UNIXプログラミング教室

  • 作者: 冨永和人,権藤克彦
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/09/28
  • メディア: 単行本(ソフトカバー)
  • 購入: 6人 クリック: 185回
  • この商品を含むブログ (22件) を見る
価格 -
日本人が書いているので読みやすい。『Unix/Linuxプログラミング 理論と実践』よりもこちらの方が独習しやすいかも。
  • 購入済み。
    • ※2013年、ピアソンの技術書撤退に伴い絶版。


GNU Make 第3版

GNU Make 第3版

価格3,024円
C言語の本ではないが、この手の知識もあった方が良いはず。


Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて

Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて

価格 -
詳解UNIXプログラミングと重複する部分が多いらしい。あちらの値段を考えるとこれを選びたくなる。
  • ※絶版


UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,篠田陽一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 1999/07
  • メディア: 単行本
  • 購入: 8人 クリック: 151回
  • この商品を含むブログ (35件) を見る
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI・ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI・ソケットとXTI

価格 -
ネットワークアプリを書かないなら必要ない?
  • ※2013年、ピアソンの技術書撤退に伴い絶版。




プログラミング技術

『リーダブルコード』の評判が良いらしい。『Code Complete』は読んでおくべきらしいが、高いし分厚いので上下の二冊とも読むのは大変だと思う。やや古いが『プログラミング作法』と『達人プログラマー』もお薦め。


価格2,177円


リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

価格2,592円
売れていて評判も良い。薄いのでサクッと読める。
  • 購入済み。


Cプログラム高速化研究班 コードを高速化する20の実験と達人の技

Cプログラム高速化研究班 コードを高速化する20の実験と達人の技

価格1,944円


CERT Cセキュアコーディングスタンダード

CERT Cセキュアコーディングスタンダード

価格5,184円


Code Craft ~エクセレントなコードを書くための実践的技法~

Code Craft ~エクセレントなコードを書くための実践的技法~

価格 -
職業プログラマ向けらしい。『Code Complete』と併せて読めば最強か。
  • ※2014年8月23日、いつの間にか絶版になっている。


CODE COMPLETE 第2版 上 完全なプログラミングを目指して

CODE COMPLETE 第2版 上 完全なプログラミングを目指して

CODE COMPLETE 第2版 下 完全なプログラミングを目指して

CODE COMPLETE 第2版 下 完全なプログラミングを目指して

価格6,588円
良書らしいが値段が高い(二冊で13,176円)し、ページ数も多い。上巻だけでも目を通しておくべきか?
  • 上のみ購入済み。


価格1,944円
プログラミングテクニック』の続編。218ページ中、grepの解説が83ページ、flexの解説が27ページ。UNIX MAGAZINEという雑誌の連載記事だったらしい。
  • 購入済み。


価格 -
有名ツールでどんなアルゴリズムが使われているかの解説など。一部のサンプルコードがK&R Cスタイルなのが時代を感じる。この手の本の中では薄くて値段が安い。
  • 購入済み。
    • ※2017年2月20日、いつの間にか絶版になっている。


新装版 達人プログラマー 職人から名匠への道

新装版 達人プログラマー 職人から名匠への道

達人プログラマー―システム開発の職人から名匠への道

達人プログラマー―システム開発の職人から名匠への道

  • 作者: アンドリューハント,デビッドトーマス,Andrew Hunt,David Thomas,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/11
  • メディア: 単行本
  • 購入: 42人 クリック: 1,099回
  • この商品を含むブログ (347件) を見る
価格3,456円
  • 旧版を購入済み。


プログラミング作法

プログラミング作法

プログラミング作法 (アスキードワンゴ)

プログラミング作法 (アスキードワンゴ)

プログラミング作法

プログラミング作法

価格3,024円
コードを書く上で気をつけるべき事、知っておくべき事が書かれた本。
  • 購入済み。


C実践プログラミング 第3版

C実践プログラミング 第3版

価格4,860円




デバッグ


実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング

価格3,024円
Linux向けの本だが、Visual C++のことも載っているらしい。


Debug Hacks -デバッグを極めるテクニック&ツール

Debug Hacks -デバッグを極めるテクニック&ツール

価格3,456円
読みにくいらしい。ミラクル・リナックスの中の人が書いた、Linuxプログラマ向けの本。


GDBを使った実践的デバッグ手法―Emacs,Eclipse,Cygwin,Insi (Interface増刊)

GDBを使った実践的デバッグ手法―Emacs,Eclipse,Cygwin,Insi (Interface増刊)

価格 -
  • ※2015年5月25日、いつの間にか絶版になっていた。


C言語 デバッグ完全解説 (Gihyo Technology)

C言語 デバッグ完全解説 (Gihyo Technology)

価格 -
バグ予防のための本。「Aのようなコードを書くとバグるので、Bのように書こう」的な内容。C99には非対応。
  • 購入済み。
    • ※2015年5月25日、いつの間にか絶版になっていた。


GDBハンドブック

GDBハンドブック

価格 -
安い。リファレンス的に使う本らしい。
  • ※2015年5月25日、いつの間にか絶版になっていた。




その他 厳選6冊

次の6冊は、複数の本で参考文献として挙げられていたので、買って損はしないと思う。

  1. プログラミング言語C
    • 上級者向け
  2. Cリファレンスマニュアル
    • 良質な辞書
  3. エキスパートCプログラミング
    • 脱初心者に。内容は結構難しい。
  4. CプログラミングFAQ
    • 良書だが絶版
  5. 詳解UNIXプログラミング
    • 値段が高い
  6. UNIXネットワークプログラミング
    • 値段が高い




その他 Webサイト

  • C言語 FAQ 日本語訳
    http://www.kouno.jp/home/c_faq/
    『CプログラミングFAQ』のWeb版。『CプログラミングFAQ』が手に入らない場合は目を通しておきたい。




※2017年2月20日、「新・明解C言語中級編」「プログラミング作法」「新・明解C言語で学ぶアルゴリズムとデータ構造」「プログラミングテクニック」の4冊を更新。

※2016年12月9日、達人プログラマーのリンクを追加。

※2016年10月15日、絶版になっている本があったので修正。いくつかリンクを追加。
※2015年5月25日、リンクを修正。5冊ほど絶版になっていたので価格を修正。
※2014年8月23日、画像を追加、値段を修正。