Я изучал вызов inotify, но я все еще немного шелушат, когда дело доходит до интерфейса чтения. Это наиболее релевантные ресурсы, которые я могу найти относительно правильного взаимодействия с inotify с помощью read (2):
- 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 inotify_events с контуром 16 байт и один с контуром 32 байта. Что будет тогда? Будет ли позднее усечено? Или ядро увидит, что оно не будет вписываться в буфер и вообще оставить его?