Я изучал вызов inotify, но все еще немного нестабилен, когда дело касается интерфейса чтения. Это наиболее важные ресурсы, которые я смог найти относительно того, как правильно взаимодействовать с inotify с помощью read (2):
Они оба реализуют его одинаково, сначала они определяют следующее sizes:
#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;
}
Теперь мы знаем, что name является частью struct inotify_event
и имеет переменную длину. Итак, нельзя ли обрезать последнее событие inotify_event в буфере?
Предположим, что существует 1023 события inotify_event с путем 16 байтов и одно с путем 32 байта. Что тогда будет? Будет ли позднее усечено? Или ядро увидит, что оно не помещается в буфер, и оставит все это целиком?