Unix核分裂の実験

新山さんのメモより。

UNIX 核分裂の実験。以下のコマンド (grep a foo >> foo) を繰り返し入力すると、最初はすぐ終わってしまうのですが、ある時点から無限にファイルが伸びるようになります。(Linux でも FreeBSD でも)

あー。これおもしろいなあ。
ファイルサイズがバッファサイズを越えると、ってことかな。そう思うと核分裂というより交通渋滞なような。

おや

上のような予測をして、バッファサイズの限界を調べてみようとしたのだが、予想と違う結果がでた。そんな単純な話じゃないのか。
"a"だけを2048行並べた4096バイトのファイルfooにgrep a foo >> fooを実行すると処理は無事に止まって、fooは二倍のサイズ(4096行8192バイト)になる。じゃ1バイトだけ増やそう、と思って最終行だけ"aa"にした2048行4097バイトのfooに同じことをすると、、

$ wc foo
2048 2048 4097 foo
$ grep a foo >> foo
$ wc foo
6144  6144 12291 foo

処理は止まるが何故かサイズが三倍に…。なんで三倍?

$ grep aa foo
aa
aa
aa

ってなるから、ちょうど二回分追加されてるってことだよなあ。うーん。