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