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没有发现什么问题,请问这可能是什么原因造成的呢?

Linux 文件存储 C++

手枪之王黑泽 9 years, 11 months ago

Your Answer