stat() 相对于文件系统是原子的

Mic*_*ick 2 c c++ winapi

我有一组可执行文件,它们每隔几分钟 24/7 定期更新一组文件。我正在考虑编写一个监控程序,它将不断检查stat()所有这些文件的上次写入时间(使用函数),以便如果最近没有更新足够的文件,它可以响起警报。但我担心的是,调用 stat() 的行为可能会导致试图写入该文件的程序失败。我需要担心吗?...如果是这样,有没有其他方法可以实现我的目标?

Ste*_*mit 5

是的,stat调用可以被认为是原子的,因为它返回的所有信息都保证是一致的。如果您stat在同一时刻调用其他进程正在写入文件,则应该不可能,例如,其他进程的写入反映在st_mtime但不反映在st_size.

在任何情况下,肯定不可能stat在同一时刻调用其他正在写入文件的进程会导致其他进程失败。(这将是操作系统中一个严重且非常不可接受的错误——操作系统的主要工作之一是确保不相关的进程不会以这种方式意外地相互交互。这种无干扰特性是不过,通常不是我们所说的“原子”。)

尽管如此,监视进程的常用方法是通过其进程 ID。并且可能有大量预先编写的包可以帮助您管理一个或多个应该连续运行的进程,为您提供干净的启动/停止和监控功能。(以s6为例。我对这个包一无所知,不推荐它;这只是我在网络搜索中遇到的第一个。)

另一种可能性是,如果您在进程之间设置了任何类型的IPC机制,则设置每个进程发布的周期性心跳,以便某个地方的看门狗定时器可以检测到进程正在死亡。

但是,如果您想通过他们编写的文件的及时性来继续监控您的进程,这听起来也是一个非常好的技术。