为什么msync()不会更改文件的st_mtime

时间:2013-05-08 01:58:48

标签: linux mmap

我使用msync时遇到问题。非常感谢你的帮助!

简而言之,我mmap文件A,并修改它和msync,但st_mtime不会改变。即使是munmap文件A并退出进程,st_mtime也没有改变。

以下是代码。

int main() {
    const char *file_name = "txt";
    int ret = -1;
    int fd = open(file_name, O_RDWR, 0666);
    if (fd < 0) {
        printf("FATAL, Fail to open file[%s]\n", file_name);
        return -1;
    }
    struct stat st;
    fstat(fd, &st);
    void * buffer = mmap(NULL, st.st_size, 
                    PROT_READ | PROT_WRITE, 
                    MAP_SHARED, fd, 0);
    if (MAP_FAILED == buffer) {
        printf("FATAL, Fail to mmap, file[%s], size[%d]\n",
            file_name, st.st_size);
        return -1;
    }
    printf("m_time[%d]\n", st.st_mtime);
    for (int i=0; i<10;i++) {
        int *ptr = (int *)buffer;
        printf("%d\n", *ptr);
        *ptr += 1;
        sleep(1);
        ret = msync(buffer, st.st_size, MS_ASYNC);
        if (0 != ret) {
            printf("FATAL, Fail to msync, file[%s], size[%d]\n",
                file_name, st.st_size);
            return -1;
        }
        fstat(fd, &st);
        printf("m_time[%d]\n", st.st_mtime);
    }
    ret = munmap(buffer, st.st_size);
    if (0 != ret) {
        printf("FATAL, Fail to munmap, file[%s], size[%d]\n",
            file_name, st.st_size);
        return -1;
    }
    fstat(fd, &st);
    printf("m_time[%d]\n", st.st_mtime);
    fsync(fd);
    fstat(fd, &st);
    printf("m_time[%d]\n", st.st_mtime);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

mmap联机帮助页的相关摘录是:

  

映射 PROT_WRITE MAP_SHARED 的文件的st_ctime和st_mtime字段将在写入映射区域之后以及后续 msync <之前更新/ strong>(2)使用 MS_SYNC MS_ASYNC 标记,如果出现。

这意味着,在您的程序中,st_mtime可能会在读取的行之间随时更新

*ptr += 1`

和读取的行

ret = msync(buffer, st.st_size, MS_ASYNC);

您的sleep(1)位于这些行之间,这意味着到睡眠发生时,st_mtime可能已被修改。因此,当您第二次fstat该文件时,您可能会获得与第一次对其进行统计时相同的值,因为没有足够的时间过去。

尝试将sleep(1)放在*ptr += 1之前。这应该保证原始fstatst_mtime的更新之间至少经过一秒钟。

答案 1 :(得分:0)

看起来修复工作正在进行中。

http://thread.gmane.org/gmane.linux.kernel/1549524/focus=55700