LINUX.ORG.RU

tail -f на С


0

0

Вопрос наверное уже классический, но ответа пока не могу придумать. Вопрос заключается в следующем - Как заставить poll|select|еще_кого_нить сообщать, что в fd, открытом на обычном файле появились данные? То есть сделать что-то вроде tail -f, но не дергая каждую секунду stat(fd,...)

anonymous
Ответ на: комментарий от anonymous

> inotify? Ну notify не имеет дело с самим fd... Выкрутиться можно конечно... а epoll() умеет так мониторить файлы? Че-нить на тему level-triggered?

anonymous
()
Ответ на: комментарий от cvv

> poll|select кажись никак. дёргать stat самый универсальный способ.

Угу, спасибо. С inotify как раз все ясно. Попробую поразбираться с epoll

anonymous
()

В *BSD tail -F (и многое другое) потрясающе красиво работает через kqueue, типа:

EV_SET(fd, EVFILT_READ, EV_ADD, 0, 0, read_callback);

EV_SET(fd, EVFILT_VNODE, EV_ADD, NOTE_DELETE | NOTE_RENAME, 0, reopen_callback);

И все, дальше висим на kevent и прыгаем на колбеки по пришедшим событиям.

Если kqueue не поддерживается, то бсд-шный tail просто засыпает после того, как дочитает до конца файла, и далее каждый раз просыпается после определенного интервала и смотрит, не увеличился ли размер файла и не изменился ли inode.

swizard
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.