Пишу программу с использованием системного вызова inotify( мониторит указанные файлы на события ). Вызов пишет результат в структуру inotify_event.
Необходимо, чтобы программа постоянно ожидала события, т е ждёт когда появятся новые события в структуре. Единственным способом ( как я понимаю ) в ожидании событий, это проверка размера стуктуры.
Получился такой цикл:
Код: Выделить всё
do
{
rc = ioctl(fd, FIONREAD, &queue_len);
}
while( !rc && queue_len < sizeof(struct inotify_event));
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
Если, что то не понятно обьяснил, говорите. Я новичок в кодинге.