2017-07-26 61 views
2

我正在使用Inotify(通过inotify-rs包装器)在文件系统中观看大量文件(不是目录)。如何使用inotify-rs生成的WatchDescriptor结构将事件与生成它们的文件进行匹配?

以下的inotify-RS方法返回一个WatchDescriptor结构:

add_watch<P>(&mut self, path: P, mask: WatchMask) -> io::Result<WatchDescriptor> 
where 
    P: AsRef<Path> 

WatchDescriptor是NEWTYPE结构:pub struct WatchDescriptor(RawFd);其中std::os::unix::io::RawFd是类型c_int/f32

对于inotify子系统返回inotify_event结构每次手表被触发:

struct inotify_event { 
     int  wd;  /* Watch descriptor */ 
     uint32_t mask;  /* Mask describing event */ 
     uint32_t cookie; /* Unique cookie associating related 
           events (for rename(2)) */ 
     uint32_t len;  /* Size of name field */ 
     char  name[]; /* Optional null-terminated name */ 
    }; 

“监视描述符” int wd由初始调用生成的表描述符匹配到add_watch()

反过来,inotify的-RS包装返回以下事件的结构:

pub struct Event<'a> {  
    pub wd : WatchDescriptor, 
    pub mask : EventMask, 
    pub cookie: u32, 
    pub name : &'a OsStr, 
} 

我试图用Event.wd将事件与正在观看的文件列表中的文件进行匹配。 (.name只返回一个文件名,如果一个目录手表上触发的事件)我试图使用HashMap,因为结构WatchDescriptor没有派生Hash特质,所以我没有成功。我试图撬开箱子并自己执行,但是这打开了一个全新的蠕虫罐。

最简单的方法应该是使用Event.wd.0获得c_int/i32但后来我不得不面对error: field '0' of struct 'inotify::WatchDescriptor' is private

有没有一种简单的方法来做到这一点,短的重写包装上,以行为方式我想要它,或者做一个公关并等待它被合并?

我已经考虑为每个正在观看的文件创建一个Inotify,但是在可以观看数百个文件的情况下,这将非常昂贵。

+0

鉴于'Event'具有'.name',你不能用它来映射回文件吗? – loganfsmyth

+0

loganfsmyth:如果正在监视一个目录,'.name'只返回一个文件名。编辑的问题包括该信息。 – arsalan86

回答

2

有与此库的一些实质性问题:

  • 类型来表示inotify的手表描述符的选择不当。 Inotify监视描述符是而不是 Unix文件描述符,它们只是一些整数,范围是每个inotify文件描述符。本身并不是一个缺陷,但我当然会认为这是一面红旗。
  • 如上所述,inotify监视描述符值的范围是每个父节点inotify文件描述符。这使得在WatchDescriptor上使用[derive(Eq)]非常可疑。看起来像一个直立的错误。
  • 没有什么可以确保在关闭inotify描述符之前关闭inotify手表。没有什么可以确保注释描述符不会在后面被重用(它们可以在注解描述符编号后重用)。这些问题可能不会立即咬你,但是......海事组织,整个inotify-rs本应宣布为unsafe。它不会增加任何实际的安全性,只是一些糖和无意义的包装。它甚至没有为手表描述符实现Drop
  • 库无助于突出的inotify的主要陷阱:(!和相同的inotify的手表描述符)共用相同的inode事件队列溢出,IN_IGNORED和硬链接

我建议你仔细阅读inotify的文档并在必要时编写自己的包装。这个库不会为你节省任何麻烦。

+0

谢谢你的回答!是的,它看起来好像图书馆需要一些工作。我已经设法对它进行分叉并做了一些改变,以解决我的使用案例(现在),但是您突出显示的问题正在让我思考如何基于此库部署任何内容。 – arsalan86

+0

为了保护'inotify-rs',过去很多人都被诡计弄得一团糟。 Android'FileObserver'具有完全相同的问题。 Java 7的'WatchService'报告通知队列溢出,但没有正确解释其他问题。即使API可以透明地处理它们,每个人都倾向于忘记硬连接... – user1643723

+0

疑难杂症,但我正在评估是否最好在我的用例中进行轮询 – arsalan86

相关问题