Как вы получаете iNotify, чтобы прочитать файл только один раз?
У меня есть следующий код:
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)
{
printf("The file %s was modified.\n", event->name);
readSettings(setRead);
//f_change = 1;
}
}
i += EVENT_SIZE + event->len;
}
//readSettings(setRead);
return 1;
}
return 0;
}
При этом используется опрос, чтобы убедиться, что функция не блокируется при чтении. Когда файл изменяется, «read \ n» печатается дважды, а файл читается дважды (я думаю, первое чтение предназначено для очистки файла, а второе — для записи в него). Я удостоверился, что мой php-код, который обращается к файлу, выполняет только одну инструкцию «fprintf», то есть только одну запись, но проверка iNotify на изменение читает дважды, возможно, из-за очистки и последующей записи?
Есть ли способ обойти это ??
Задача ещё не решена.
Других решений пока нет …