pub fn read_events(fd: &Fd) -> Result<Vec<InotifyEvent>, CoreError>Expand description
Read all available inotify events from the descriptor.
This function drains the inotify file descriptor until no more events
are available (EAGAIN). It is safe to use with edge-triggered reactors.
§Edge Cases
- Zero-length read: If the descriptor is non-blocking and no data is
ready, this returns
Ok(Vec::new())(viaEAGAINmapping). - Partial read: This function ensures that only complete event structures are decoded from the buffer.
§Errors
EBADF: The provided file descriptor is invalid.EFAULT: The internal buffer points outside the process’s address space.EINVAL: Internal buffer is too small for even one event (should not happen).EIO: Low-level I/O error.
Examples found in repository?
examples/watch_temp.rs (line 23)
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6 let mut reactor = Reactor::new()?;
7 let (inotify_fd, inotify_token) = reactor.setup_inotify()?;
8
9 let temp_dir = std::env::temp_dir();
10 let temp_dir_str = temp_dir.to_string_lossy().into_owned();
11
12 println!("Watching {} for modifications...", temp_dir_str);
13 add_watch(&inotify_fd, &temp_dir_str, MODIFY_MASK)?;
14
15 let mut events = Vec::new();
16 // Monitor for 10 seconds
17 let start = std::time::Instant::now();
18 while start.elapsed() < Duration::from_secs(10) {
19 let n = reactor.wait(&mut events, 64, 1000)?;
20 if n > 0 {
21 for ev in &events {
22 if ev.token == inotify_token {
23 let in_events = read_events(&inotify_fd)?;
24 for ie in in_events {
25 if let Some(name) = ie.name {
26 println!("File modified: {}", String::from_utf8_lossy(&name));
27 } else {
28 println!("Directory modified (wd={})", ie.wd);
29 }
30 }
31 }
32 }
33 }
34 }
35
36 println!("Finished watching.");
37 Ok(())
38}