【发布时间】:2014-04-07 15:53:22
【问题描述】:
我正在使用 mmap 加载一个只有只读访问权限的大文件。
预计 cron 作业会覆盖此文件,每天更新一次内容。
我的问题是我的可执行文件如何重新映射更新的文件以获取更新的内容? 我需要再次调用 mmap 吗?我的可执行文件如何知道文件的更新时间?
通常推荐的折衷方法和选项是什么?
【问题讨论】:
我正在使用 mmap 加载一个只有只读访问权限的大文件。
预计 cron 作业会覆盖此文件,每天更新一次内容。
我的问题是我的可执行文件如何重新映射更新的文件以获取更新的内容? 我需要再次调用 mmap 吗?我的可执行文件如何知道文件的更新时间?
通常推荐的折衷方法和选项是什么?
【问题讨论】:
如果 cron 作业只是打开文件并覆盖其中的数据,则新数据应立即反映在您的映射内存中。如果 cron 作业创建一个新文件,将数据写入那里,然后调用 rename() 将新文件移到旧文件之上,则需要关闭旧文件并重新打开以获取新数据。通常这样做是为了避免在重写文件时发生电源故障时数据损坏。
至于您如何获得通知,有多种可能性。最简单的可能是让 cron 作业只向您的进程发送一个信号(例如SIGUSR1)。然后,您可以对信号做出反应并完成您的工作。否则,您可以使用 inotify(在 Linux 上)来监视您的文件是否有写入。
另一种选择是定期轮询文件的mtime 以检测更改。不过,就我个人而言,我会避开这条路线,因为它看起来相当老套和不雅。
【讨论】: