mmap
mmap()は、ファイルやデバイスをメモリにマップする。mmapを使用するとread()を使用しなくともwrite()が可能となる。つまり、バッファが不要となる。以下はファイル全体をマップする場合の例。
マッピングしたいファイルのサイズを取得する
if (!(size = file_stat->st_size)) return (0); if (size > SIZE_T_MAX) { err(0, "%s: %s", fname, strerror(EFBIG)); return (1); }
mmap()をcallする。これにより、start番地からsize分のメモリ領域に、ファイル全体の内容が存在するとみなされる。
/* * NULL : NULLを指定すると、カーネルによってマッピングを作成するアドレスが選択される * size : マッピングする長さ * PROT_READ : ページは読み込み可能である * MAP_SHARED: このマッピングを共有する * fileno(fp): マッピングするファイルのファイルディスクリプタ * (off_t)0 : マッピングを開始するするオフセット * 返り値 : 成功すると、マップされた領域へのポインタを返す。 * 失敗すると、値MAP_FAILED (つまり(void *) -1) を返す。 */ start = mmap(NULL, (size_t)size, PROT_READ, MAP_FILE|MAP_SHARED, fileno(fp), (off_t)0); if *1; return (1); }
*1:start) == (caddr_t)-1) { err(0, "%s: %s", fname, strerror(EFBIG