- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用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
之前。这应该保证原始 fstat
和 st_mtime
更新之间至少间隔一秒。
关于linux - 为什么 msync() 不改变文件的 st_mtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431457/
我有一个程序想要检查文件是否已被修改。 regtest 失败,事实上,尽管文件已更改,st_mtime 却没有!此外,外部统计数据也证实了这一点。 我相信 st_mtime 应该改变,因为 stat(
为什么这个程序在 Ubuntu 中构建时会产生语法错误? #include "stdio.h" #include "stdlib.h" #include "string.h" #inc
我正在尝试在 Cygwin 中使用 Python 3.8 获取文件的最后修改时间。 所以如果我执行 stat .profile 我会得到: File: .profile Size: 1236
我正在做一个fstat在我的文件描述符上并将其转储到 struct stat 。我阅读了 fstat 的文档(链接如下),它声称有成员 st_atime和st_mtime . http://pubs.
我在使用msync时遇到一个问题。非常感谢您的帮助! 简而言之,我映射文件A,并修改它和msync,但st_mtime没有改变。即使munmap文件A并退出进程,st_mtime也不变。 以下是代码。
我想从结构stat中显示我的两个属性 struct stat { dev_t st_dev; /* ID of device containing file */ ino_t
在此示例中,我使用的是在 OSX shell 中使用 pyenv 安装的 Python 3.6.5。 我一直在尝试一些概念证明文件监视代码,我认为使用文件当前和上次测量的增量 st_mtime 足以“
从 stat() 调用检索到的修改时间转换为 datetime 对象的最惯用/最有效的方法是什么?我想出了以下(python3): from datetime import datetime, tim
当我使用 O_CREAT 标志在 UNIX 中创建或打开文件时,st_mtime、st_ctime 和 st_atime文件发生变化。但是,当我使用 O_TRUNC 标志创建或打开文件时,只有 st_
我需要将 st_mtime 转换为字符串格式以将其传递给 java 层,我尝试使用此示例 http://www.cplusplus.com/forum/unices/10342/但是编译器产生错误 i
对于我的计算机科学课,我们正在 C 程序中实现“ls”功能,并且需要使用 st_mtime 字段。然而,当我使用 struct stat 时,它只有一个 st_mtim 字段,而不是我需要的 st_m
我是一名优秀的程序员,十分优秀!