Я использую следующий код для мониторинга файла с помощью уведомления. Я сначала опрашиваю, а затем читаю, если есть изменения, чтобы предотвратить блокировку:
int settingsCheck(int &length, int &i, char * buffer, int &fd, string setRead[])
{
int f_change = 0;
struct pollfd pfd = { fd, POLLIN, 0 };
/* Poll with a timeout of 100ms */
int ret = poll(&pfd, 1, 100);
/* Check to see the result of the poll */
if (ret < 0) {
fprintf(stderr, "Poll failed: %s\n", strerror(errno));
}
else if (ret == 0) {
/* Timeout with no events -> move on */
}
else {
/* Process the new event */
struct inotify_event event;
length = read(fd, buffer, BUF_LEN);
printf("read\n");
while (i < length)
{
struct inotify_event *event = (struct inotify_event *) &buffer[i];
if (event->len)
{
if (event->mask & IN_MODIFY && event->name == "setitngs.txt")
{
printf("The file %s was modified.\n", event->name);
//f_change = 1;
}
else if(event->mask & IN_MODIFY)
{
printf("Not settings\n");
}
}
i += EVENT_SIZE + event->len;
}
readSettings(setRead);
return 1;
}
return 0;
}
Когда я изменяю отслеживаемый текстовый файл (который изменяется с помощью php-скрипта), моя программа читает файл несколько раз (2-4), иногда читая только правильные данные при окончательном чтении.
Кто-нибудь знает, почему это происходит / как это исправить?
PS: Я правильно сказал, что если я вызову функцию readSettings () внутри следующего, если:
if (event->mask & IN_MODIFY && event->name == "setitngs.txt")
тогда readSettings () должен вызываться только один раз, когда отслеживается «settings.txt»?
Задача ещё не решена.
Других решений пока нет …