共有メモリマッピングmmapノート
9363 ワード
共有メモリマッピングmmapノート
文書ディレクトリ
マッピング領域の作成:mmap関数のプロトタイプ
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
パラメータ
戻り値
解放マッピング領域:munmap関数プロトタイプ
int munmap(void *addr, size_t length);
パラメータ
サンプルコード
#include
#include
#include
#include
#include
#include
#include
#include
void sys_err(const std::string& str) {
perror(str.c_str());
exit(1);
}
int main(void)
{
//
char* p = nullptr;
//
int fd;
fd = open("testmap.tmp", O_RDWR | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
sys_err("open error");
}
//
ftruncate(fd, 100);
int len = lseek(fd, 0, SEEK_END);
//
p = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);//C++
if (p == MAP_FAILED) {
sys_err("mmap error");
}
//
close(fd);
// p
strcpy(p, "========HELLO========");
// p
printf("%s", p);
//
int ret = munmap(p, len);
if(ret == -1){
sys_err("munmap error");
}
return 0;
}
注意事項
mmap匿名マッピング領域
ディスク上でファイルを操作しない
例
#include
#include
#include
#include
#include
#include
#include
#include
void sys_err(const std::string& str) {
perror(str.c_str());
exit(1);
}
int main(void)
{
//
char* p = nullptr;
//
int len = 100;
// MAP_ANON
p = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); //C++
if (p == MAP_FAILED) {
sys_err("mmap error");
}
//
strcpy(p, "99999");
// p
printf("%s", p);
//
int ret = munmap(p, len);
if (ret == -1) {
sys_err("munmap error");
}
return 0;
}