我一直在学习inotify调用,但是当涉及到读取接口时仍然有些困惑。以下是我找到的关于如何使用read(2)正确地与inotify进行交互的最相关资源:
- http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/index.html
- http://www.linuxjournal.com/article/8478
它们都以相同的方式实现它,首先定义以下大小:
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 )
然后他们以这种方式使用它们:
length = read( fd, buffer, BUF_LEN );
if ( length < 0 ) {
perror( "read" );
}
while ( i < length ) {
struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
/* some processing */
i += EVENT_SIZE + event->len;
}
现在,我们知道名称是struct inotify_event
的一部分,并且它具有可变长度。那么,缓冲区中的最后一个inotify_event可能会被截断吗?
假设有1023个具有16字节路径和1个具有32字节路径的inotify_events,那么会发生什么?那么后者会被截断吗?还是内核会看到它不适合于缓冲区并完全留下它?
avail
来确定缓冲区的大小。avail
只是当前可用数据的量,当您首次启动时它将为零。而且每次循环都设置缓冲区大小也不是一个好主意。 - Arielselect
或类似函数报告有可读数据时被调用,因此我们知道avail
是非零的。而且,由于buffer[avail]
是一个在堆栈上分配的C99变长数组,每次循环设置缓冲区大小的成本微不足道。 - Josh Kelleyread()
和poll()
对我来说没有意义。实际上,一个合理的上限是4MB,缓冲区的合理大小约为1K到64K。由于在堆栈上处理4MB有些棘手,因此将其放在堆栈上真的不值得 - 你并没有获得任何好处。 - Ariel