mmap

ファイルをそのまんま,メモリにマッピングするAPI.
のようだ.
つまり,freadやらfscanfだと,seekやらなんやらしてバイトデータを読み取っていたところをまんま直接扱えるわけだ.
ウマーーー.
下のサンプルは,mapfileを開き,そこにsonを書き込むというものだ,

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main( int argc, void **args)
{
char *data;
int fd;
int map_length=100;
// open target file
fd = open("mapfile", O_RDWR);
// mapping the file into memory
data = (char*)mmap((caddr_t)0, map_length, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
// display buffer before editing
printf("%s",data);
// edit
memcpy(data,"son",3);
// display buffer after editing
printf("%s",data);
// sync memory and file
msync(data, map_length,MS_SYNC );
// unmapping
if(munmap(data,  map_length))
printf("unmapping is failed.
");
return 0;
}

流れ?

やっぱり,便利なところは,ポインタでそのままファイルを扱えることか.
でも,これって元のファイルより容量の大きいデータを書き込むとどうなるんだ ろう.
とおもって,やってみたら,Segmentation Faultで落ちた.
・・・・.また,調べてみよう.
とりあえず,流れは,
(1)mmapで開く.
(2)ポインタで処理する.
(3)msyncで,アプリケーションで処理した結果を元のファイルに反映する.
(4)munmapでメモリを解放する.
こんなもんか.
でも,これめちゃ便利だよなぁ.
昔作ったLightWaveの読み込みライブラリのファイル読み取り部分,もっと簡単に作れたのに・・・・.
やはり,無知は罪だ.