データを仮想アドレス空間にマップする必要があります。
ファイルまたはブロック デバイス (例: /dev/sda
) を開き、open(2)
ここにファイル記述子を渡します。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/mman.h>
void * map_file_descriptr(int fd) {
struct stat file_stat;
if (fstat(fd, &file_stat)) {
perror("fstat");
// do something on error
return NULL;
}
void * data = mmap(
NULL // place the the VM segment anywhere in the process virtual address space
, file_stat.st_size // file size
// For read-only:
, PROT_READ
, MAP_PRIVATE
// for read-write
/*
, PROT_READ | PROT_WRITE
, MAP_SHARED
*/
, fd // file which belongs to this file descriptor
, 0 // from the beginning
);
if (data == MAP_FAILED) {
perror("mmap");
// you most likely are out of memory to allocate the VM table
// this very rarely happens
return NULL;
}
return data;
}
ファイルを読み取り/書き込みアクセス用にマップした場合は、更新をディスクにフラッシュするMAP_SHARED
必要があります。msync(2)
注意:MAP_PRIVATE
ファイルがマッピング後に別のプロセスによって変更された場合、ファイルをマッピングすると、未定義の動作が発生します。また、マッピング後にファイル サイズが変更された場合、マッピングによって未定義の動作が発生します。
注:のMAP_PRIVATE
マッピングPROT_WRITE
は書き込み可能ですが、マッピングが削除されたときに変更がファイルに書き戻されることはなく、それらのマッピングも同期できません。