Linux kernel Inotify读取单个事件

Linux kernel Inotify读取单个事件,linux-kernel,inotify,Linux Kernel,Inotify,我有一个应用程序,可以在同一个inotify fd上注册多个inotify手表。由于应用程序的结构,我需要逐个读取事件(而不是单个read(2)可能返回多个事件),但到目前为止,我还没有找到这样做的方法 最初我试图读取事件头struct inotify_event,然后根据.len字段读取事件的其余数据。但是,如果提供的缓冲区太小,则inotify fd上的read(2)将因EINVAL而失败,如下所述: 查看源代码,read的实现将尝试在给定传递给它的缓冲区大小的情况下返回尽可能多的事件。可以

我有一个应用程序,可以在同一个inotify fd上注册多个inotify手表。由于应用程序的结构,我需要逐个读取事件(而不是单个
read(2)
可能返回多个事件),但到目前为止,我还没有找到这样做的方法

最初我试图读取事件头
struct inotify_event
,然后根据
.len
字段读取事件的其余数据。但是,如果提供的缓冲区太小,则inotify fd上的
read(2)
将因
EINVAL
而失败,如下所述:

查看源代码,
read
的实现将尝试在给定传递给它的缓冲区大小的情况下返回尽可能多的事件。可以看出,如果成功复制了一个事件,它将继续循环,尝试复制更多的事件(如果存在)

我还考虑了使用
ioctl(FIONREAD)
的可能性,但它返回所有排队事件的总大小,而不仅仅是一个(好吧,正如预期的那样…)

目前,我最擅长的方法是从
read(…,sizeof(struct inotify_event))
开始。如果在
EINVAL
中失败,请尝试
读取(…,sizeof(struct inotify_事件)*2-1)
,然后使用
sizeof(struct inotify_事件)*3-1,依此类推。这将是在事先不知道单个事件大小的情况下,实现单个事件读取所需的最少系统调用数。不过,很明显,这不是最优的

有没有更好的方法实现单次读取

 The behavior when the buffer given to read(2) is too small to return
 information about the next event depends on the kernel version: in
 kernels before 2.6.21, read(2) returns 0; since kernel 2.6.21,
 read(2) fails with the error EINVAL.