Базовое использование
В соответствии с inotify (7) , вы можете использовать FIONREAD ioctl, чтобы узнать, сколько данных доступно для чтения, и соответственно изменить размер вашего буфера.Вот некоторый (очень грубый) код, который может выполнить это:
unsigned int avail;
ioctl(inotify_fd, FIONREAD, &avail);
char buffer[avail];
read(fd, buffer, avail);
int offset = 0;
while (offset < avail) {
struct inotify_event *event = (inotify_event*)(buffer + offset);
// Insert logic here
my_process_inotify_event(event);
offset = offset + sizeof(inotify_event) + event->len;
}
Более надежное использование
inotify-tools предоставляет высокоуровневый интерфейс для inotify.Вы можете использовать его вместо доступа к inotify или посмотреть, как он реализует inotifytools_next_events для безопасного и надежного чтения всех доступных событий.
Частичные события и усечение
В ответна ваши вопросы об усечении я не думаю, что ядро когда-либо возвратит частичное inotify_event или усечет inotify_event, если указанный буфер слишком мал для всех событий.Следующий абзац из man-страницы inotify (7) предлагает следующее:
Поведение, когда буфер, переданный read (2), слишком мал, чтобы возвращать информацию о следующем событии, зависит от версии ядра: inядра до 2.6.21, read (2) возвращает 0;начиная с ядра 2.6.21, read (2) завершается с ошибкой EINVAL.
Как и следующие комментарии от inotifytools.c :
// oh... no. this can't be happening. An incomplete event.
// Copy what we currently have into first element, call self to
// read remainder.
// oh, and they BETTER NOT overlap.
// Boy I hope this code works.
// But I think this can never happen due to how inotify is written.