kagamihogeの日記

kagamihogeの日記です。

Direct I/O で入出力

CでDirect I/O を行う場合、open 呼び出しの引数にO_DIRECTを指定する。インクルードするヘッダーはfcntl.hで、実際に定義されているのは bits/fcntl.h。今のところ一番新しいcygwin gccだと、fcntl.hだけでコンパイルできるけど、linux上だとこれだけではダメ。gccの-Dオプションに_GNU_SOURCEをいれるか、下みたいに_GNU_SOURCEのdefineを行う。

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
〜なんかソースコード
#endif/* ifndef _GNU_SOURCE */

O_DIRECTで入出力を行う場合、ヘンな制限がある。linux kernel 2.4までは入出力を行うバッファの大きさをファイルシステムのブロックサイズでアラインメントを取る必要がある。linux kernel 2.6からは512バイトの倍数になっていればよい。

で、そのアライメントの取り方。mallocだとダメなので、アライメントされたメモリの割り当てを行うposix_memalignを使用する。

このO_DIRECT、結構クセモノのようで、環境によって使えたり使えなかったりがあるようです(特にkernel 2.4で)。古いRed HatだとそもそもO_DIRECTを無効にしてたりとか。

参考URL:
はぐれオタク高踏派 - O_DIRECT を使う
Manpage of POSIX_MEMALIGN