可以使用inotify监视要创建的特定文件,而无需监视整个目录吗?


9

我想在创建特定文件名时收到通知。我在看inotify。该IN_CREATE标志可用于监视目录中的任何更改,但是我不希望监视整个目录,因为除了我感兴趣的文件之外,该目录中可能还有很多活动。可以做到这一点吗? ?


3
我猜答案是“不”。至少没有与inotify。如果可以控制文件的位置,最好只为它创建一个特殊目录,这样就可以监视目录,而不会因干扰而醒来。如果你无法控制的位置,你面对无论是对你的文件的(相对)的名字,否则调用类似返回的“名称”字段比较accessF_OK,看它是否存在呢。
BobDoolittle 2014年

Answers:


7

您不能让内核仅通知您对特定路径的更改。原因有些微妙:

  • 在Linux中,文件对象的存在独立于其可能具有的任何名称。文件的名称实际上是其包含目录的属性,并且单个文件可以由多个名称调用(请参阅硬链接)。

  • 内核必须具有将inotify对象附加到其中的内容;由于路径名不是真正的文件系统对象,因此无法将对象附加到路径名;您必须附加到父目录或路径描述的文件。但是您无法附加到文件,因为您正在查看是否已创建具有给定名称的文件,而不是更改为给定文件。

从理论上讲,内核可以实现一个API,该API允许您在将监视添加到目录时为给定的路径名​​选择事件,与允许您选择事件类型的方式大体相同。这会使API膨胀,并且内核最终将处理与用户空间中相同的数据并进行相同的字符串比较。

将手表放在非常活跃的目录上是否会对性能产生明显影响?我不确定你的意思是多么活跃。每秒几十个文件,几百万个,几百万个?

无论如何,我都会避免access:它总是会竞争的。可以在调用之间创建和删除文件access,并且access在非常紧密的循环中调用会很慢,这inotify是设计用来解决的问题。


如果无法通知我“改变某条路径”,那么inot化将如何工作?您也许是专门指文件路径而不是目录路径?
BobDoolittle

同样,在内核而不是用户空间中进行检查的好处是,如果有多个进程在监视目录。不必在上下文中不必要地切换它们并让它们进行比较,您只需切换实际上在乎所涉及文件路径的过程即可。
BobDoolittle

我的意思是,在监视目录(显然是由路径指定)时,您不能告诉内核仅选择具有给定名称的事件(因此,是的,我指的是“文件”路径)。我了解不唤醒大量流程的理论好处,但是我不得不再次询问您是否尝试使用inotify,以及性能是否是实际问题。
迪伦·弗雷斯

1
或者,如果许多进程对某些事件感兴趣,则可以让一个进程监视文件名,并通过UNIX套接字将“有趣的”事件通过UNIX套接字发送给实际上对这些事件感兴趣的进程(作为一种服务)。
迪伦·弗雷斯

性能问题可能非常难以衡量和诊断。我不想走进砖墙,而是更喜欢首先采用良好的编程习惯,开发使用良好设计模式的软件,并避免这种情况。所以不,我没有发现问题。我预料到了一个潜在的问题,由于这种潜在的问题,在这种情况下避免使用inotify。作为我自己的系统软件开发人员,我坚信提供可靠的机制来帮助人们避免性能问题,这是创新的目的。
BobDoolittle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.