0

我在使用 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;
}
4

2 回答 2

0

手册页的相关摘录mmap是:

使用PROT_WRITEMAP_SHARED映射的文件的 st_ctime 和 st_mtime 字段将在写入映射区域之后更新,并且在带有MS_SYNCMS_ASYNC标志的后续msync (2)之前(如果发生)。

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

*ptr += 1`

和那一行

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

sleep(1)在这两条线之间,这意味着在睡眠发生时,st_mtime可能已经被修改了。因此,当您fstat第二次创建文件时,您可能会获得与第一次统计时相同的值,只是因为没有足够的时间过去。

尝试将您sleep(1)的放在*ptr += 1. 这应该保证在原始文件fstat和更新到st_mtime.

于 2013-05-08T14:39:29.367 回答
0

看起来修复正在进行中。

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

于 2013-09-01T17:29:59.683 回答