LINUX.ORG.RU

Inotify не замечает изменения файла

 ,


1

1

Привет, ЛОР!

Я тут второй день пытаюсь заставить Линух(OpenWRT) отслеживать изменения в файле.

В документации сказано, что inotify умеет в отслеживание файлов. Однако, у меня не замечает изменений. Код следующий:

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/inotify.h>
#include "log.h"

#define EPOLL_RUN_TIMEOUT       -1
#define MAX_EPOLL_EVENTS        10
#define MAX_INOTIFY_BUF_SIZE    1024

int main(int argc, char **argv)
{
    int result;
    // inotify для отслеживания изменения /etc/config/myprog
    int inotifyFD = inotify_init();
    if(inotifyFD < 0)
    {
        LOG("Couldn't initialize inotify\n");
    }

    int inotifyWatch = inotify_add_watch(inotifyFD, "/etc/config/myprog", IN_MODIFY); 
    if (inotifyWatch < 0)
    {
        printf("Couldn't add watch to /etc/config/myprog\n");
    }
    char inotifyBuf[1024];

    // epoll для отслеживания срабатывания inotify
    struct epoll_event epollConfig;
    struct epoll_event epollEvent[MAX_EPOLL_EVENTS];
    int epollFD = epoll_create(sizeof(inotifyFD));

    epollConfig.events = EPOLLIN | EPOLLET | EPOLLOUT;
    epollConfig.data.fd = inotifyFD;
    // add our listening socket into epoll
    result = epoll_ctl(epollFD, EPOLL_CTL_ADD, inotifyFD, &epollConfig);
    if(result < 0)
    {
        LOG("Error while inotify epoll regisration\n");
    }


    while (1) 
    {
        result = epoll_wait(epollFD, epollEvent, MAX_EPOLL_EVENTS, EPOLL_RUN_TIMEOUT);
        read(inotifyFD, &inotifyBuf, MAX_INOTIFY_BUF_SIZE);
        LOG("config modified!\n");
    }
    return 0;
}

PS: если я меняю /etc/config/myprog на /etc/config/ , то все работает, но, как и ожидаемо, ловит изменения всех файлов в директории.

PPS: меняю файл просто командой echo '123' >> /etc/config/myprog



Последнее исправление: vgovseychuk (всего исправлений: 1)

А почему у тебя inotifyFD создан как блокирующий ?
Вообще, посмотри на пример из man inotify.

joy4eg ★★★★★
()
Ответ на: комментарий от joy4eg

блокирующий/неблокирующий - работают одинаково: если правлю через nano, то срабарывает. Если echo - нет.

vgovseychuk
() автор топика
Ответ на: комментарий от vgovseychuk

Проверь config ядра, там есть некоторое количество опций по всей видимости за это отвечающих

Ubuntu 16.04 LTS:

$ cat /boot/config-4.4.0-28-generic |grep NOTIFY
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
# CONFIG_AUFS_HNOTIFY is not set

alx777 ★★
()
Ответ на: комментарий от vgovseychuk

ЕМНИП, там еще могут быть грабли в том, на какой ФС находится файл в данный момент.
Я бы попробовал подключить все события (IN_ALL_EVENTS), и посмотреть, как оно себя ведет на OpenWRT и на Ubuntu.

joy4eg ★★★★★
()
Ответ на: комментарий от alx777

недостающие конфиги включил, IN_ALL_EVENTS включил - результат один:

На убунту работает и с директорией и с файлом

На OpenWRT - только если смотреть на изменение директории.

Думаю, может, реагировать на изменения всенх файлов и как-то смотреть, какой именно файл изменился. Только не знаю, как это определить.

vgovseychuk
() автор топика
Ответ на: комментарий от joy4eg

Кажись, нашлось. Спасибо за наводку про разные ФС. Если следить за файлом, допустим, в /tmp/ или любой «обычной» директории, то все гуд. Если же в /etc/config/ , то не видит изменений в файле.

Не, подскажете, кстати, как это можно побороть?

vgovseychuk
() автор топика
Ответ на: комментарий от vgovseychuk

С другой стороны, может, парсить все конфиги. У меня приложенька и с сетью работает, так что прочекать все не будет лишним при изменении сетевых настроек, dhcp и т.д.

vgovseychuk
() автор топика
Ответ на: комментарий от vgovseychuk

Не, подскажете, кстати, как это можно побороть?

Скорей всего, это какие-то особенности OverlayFS.
Вот еще инфа, хз насколько актуальная.

Overlayfs's support for inotify mechanisms is not complete yet. Events like IN_CLOSE_WRITE cannot be notified to listening process.

Победить ... как костыль, можно мониторить файл в /tmp, и потом синкать с /etc/config.
Либо же попробовать найти раздел с jffs2, и там держать конфиг, с симлинком на /etc/config.

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