mmap映射的文件保存之后重新打开,为什么除了前几个字节之外数据都丢失了?
我正在写一个简单的本地缓存,我希望将缓存的内容映射到硬盘文件上。但是我重新打开这个文件之后发现除了开头的几个字节之外,其他部分的数据全部丢失了(变成0).
以下是文件映射部分的源码(C++):
template <typename K, typename V>
void *cache<K, V>::attachFile(const char *pathname, size_t length) {
int fd;
struct stat statbuff;
if (stat(pathname, &statbuff) == -1) {
fd = open(pathname, O_RDWR|O_CREAT|O_EXCL, 0644);
if (fd == -1)
errexit("open O_CREAT");
if (ftruncate(fd, length) == -1) {
close(fd);
errexit("ftruncate");
}
}
else {
if (static_cast<size_t>(statbuff.st_size) != length)
errexit("length is not correct.");
fd = open(pathname, O_RDWR);
if (fd == -1)
errexit("open O_RDWR");
}
void *addr = mmap(NULL, length, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);
close(fd);
if (addr == MAP_FAILED)
errexit("mmap");
// return NULL;
return addr;
}
template <typename K, typename V>
void cache<K, V>::releaseFile(void *addr, size_t length) {
if (addr != NULL && length != 0) {
if (msync(addr, length, MS_SYNC) == -1)
errexit("msync");
if (munmap(addr, length) == -1)
errexit("munmap");
}
}
完整代码在
https://github.com/choleraehyq/lightcache
我的开发平台是ubuntu14.04,编译器是G++4.9.2,查看了APUE没有发现什么问题,请问这可能是什么原因造成的呢?
手枪之王黑泽
9 years, 11 months ago