0

msync を使用するときに質問があります。ご助力ありがとうございます!

簡単に言うと、ファイル A を mmap し、それと 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_WRITEおよびMAP_SHAREDでマップされたファイルの st_ctime および st_mtime フィールドは、マップされた領域への書き込みの後、 MS_SYNCまたはMS_ASYNCフラグが発生した場合は後続のmsync (2)の前に更新されます。

つまり、プログラムでst_mtimeは、次の行の間でいつでも更新される可能性があります。

*ptr += 1`

そして、そして読む行

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

あなたsleep(1)はこれらの行の間にあります。つまり、スリープが発生するまでに、st_mtimeはすでに変更されている可能性があります。そのfstatため、ファイルを 2 回目にすると、十分な時間が経過していないという理由だけで、最初にそれを統計したときと同じ値が得られる可能性があります。

sleep(1)の前に your を付けてみてください*ptr += 1fstatこれにより、オリジナルと への更新の間に少なくとも 1 秒が経過することが保証され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 に答える