我使用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;
}
答案 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
之前。这应该保证原始fstat
和st_mtime
的更新之间至少经过一秒钟。
答案 1 :(得分:0)