inotify

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Pal
мл. сержант
Сообщения: 97
Зарегистрирован: 2008-07-04 14:40:14

inotify

Непрочитанное сообщение Pal » 2008-10-07 15:35:02

Здравствуйте.
Пишу программу с использованием системного вызова inotify( мониторит указанные файлы на события ). Вызов пишет результат в структуру inotify_event.
Необходимо, чтобы программа постоянно ожидала события, т е ждёт когда появятся новые события в структуре. Единственным способом ( как я понимаю ) в ожидании событий, это проверка размера стуктуры.
Получился такой цикл:

Код: Выделить всё

                do
                {
                rc = ioctl(fd, FIONREAD, &queue_len);
                }   
                while( !rc && queue_len < sizeof(struct inotify_event));
fd - Дескриптор вызова inotify ( fd = inotify_init(); )
C помощью функции ioctl, получаем queue_len - размер очереди в байтах, и на основе размера стуктуры, делаем вывод о количестве ожидаемых событий.
Всё хорошо, но такой цикл отжирает 100% проца. Можно добавить sleep() и проблема решена.
Я новичок в программировании, и прошу совета правильно ли будет решение с использованием функции sleep?
Существует пакет inotify_tools http://inotify-tools.sourceforge.net/ , в состав которого входит программа inotifywait, она мониторит файлы на события, с последующим выводом на STDOUT результата. В коде этой программы есть похожий цикл, но каким образом устроено ожидание событий не могу разобраться.

Для понятности вот полный код моей программы:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <linux/inotify.h>
#include <sys/ioctl.h>

int
main(int argc, char *argv[])
{
        /*Инициализация inotify*/
        int fd;
        fd = inotify_init();
        if(fd < 0)
        {
                perror("inotify_init");
                return 1;
        }
         /*Вызов стража*/
        int wd; 
        wd = inotify_add_watch(fd, argv[1], IN_MODIFY | IN_MOVE_SELF); 
        if(wd < 0)
        {
                perror("inotify_add_watch");
                return 1; 
        }

        while(1)
        {
                char *buf;
                struct inotify_event *event;
                unsigned int queue_len;
                int rc;

                do
                {
                rc = ioctl(fd, FIONREAD, &queue_len);
                sleep(1);
                printf (" Ожидает в очереди %u байтов\n", queue_len);
                }

                while( !rc && queue_len < sizeof(struct inotify_event));
                buf = malloc(queue_len); /* buf ссылается на первый байт выделенного участка памяти */
                if(read(fd, buf, queue_len) == -1)
                {
                        perror("read");
                        return 1;
                }
                if ( event->mask & IN_MODIFY | IN_MOVE_SELF )
                       printf ( " Файл был изменён\n " );
                int i;
                for(i = 0; i < queue_len; i += event->len + sizeof(struct inotify_event))
                {
                        event = (struct inotify_event *) (buf + i); /* event ссылается на (buf + i)  */
                           printf("wd = %d, mask = %08X, cookie = %d, len = %d, name = %s\n",
                                      event->wd, event->mask, event->cookie, event->len, &event->name);
                           printf (" Размер стуктуры inotify:%d\n", sizeof(struct inotify_event));

                }

                free(buf);
        }

         return 0;
}
Результат:
Ожидает в очереди 16 байтов
Файл был изменён
wd = 1, mask = 00000800, cookie = 0, len = 0, name =
Размер стуктуры inotify:16
Вообщем прошу совета, каким образом правильно реализовать ожидание событий.
P.s
Если, что то не понятно обьяснил, говорите. Я новичок в кодинге.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: inotify

Непрочитанное сообщение paradox » 2008-10-08 23:19:54

все гараздо проще
man kevent если для freebsd
а пример того как происходит измение собитые в файле
команда tail
есть в соурсах бсд
либо на cvsweb.freebsd.org