不気味な現象?
Raspberry Pi の音声取込でサンプリングレートを監視していたら、ログの中に奇妙な現象を発見してしまった。なんと、ファイルサイズが 2147483647 バイトで飽和している。コンピュータ技術者なら暗記している数字だと思うが(←してません!)、この数字は不気味だ! いわく、2^31 - 1。
最初、NFS の実装の問題と思ったけど、最近は 2GB 超えるファイルなんて当たり前に使うし、んな訳ないだろう。
よく考えたみたら、同じコードを使った以前のシステムは 64-bit Linux なのだった。今回の Raspberry Pi は、当然 32 ビット。
実は、GLIBC の(?)fopen() は、32 ビット OS では 32ビットのファイルサイズまでしか扱えないのだそうだ。そんなの知らなかった。← 注: やや嘘
正確には Linux の open() システムコールには O_LARGEFILE というオプションがあって、32ビット Linux ではこれを指定しないと 32ビット超のファイルをアクセスできないぽい。この辺をゴニョゴニョしているのが fopen64() とか _FILE_OFFSET_BITS とかいう C マクロなのだそうだ。
- http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
- http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/open64.htm?lang=en
ところで、NetBSD はどうなっているんだろう。off_t 型はどうなっているんだっけ?