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没有发现什么问题,请问这可能是什么原因造成的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
楼主,做了单元测试了么?我用你的代码测了一下,没有问题啊:
建议楼主:建议楼主单独测一下这两个方法,再检查一下其他部分的代码。
我的环境:Ubuntu 12.04, g++ 4.6.3