[Tips] mmap
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の読み込みライブラリのファイル読み取り部分,もっと簡単に作れたのに・・・・.
やはり,無知は罪だ.