gpt4 book ai didi

linux - 为什么 msync() 不改变文件的 st_mtime

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:50 26 4
gpt4 key购买 nike

我在使用msync时遇到一个问题。非常感谢您的帮助!

简而言之,我映射文件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;
}

最佳答案

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

The st_ctime and st_mtime field for a file mapped with PROT_WRITE and MAP_SHARED will be updated after a write to the mapped region, and before a subsequent msync(2) with the MS_SYNC or MS_ASYNC flag, if one occurs.

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

*ptr += 1`

以及读取的行

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

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

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

关于linux - 为什么 msync() 不改变文件的 st_mtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com