«хвост» нескольких файлов в C / C ++ (Linux) с помощью inotify (условие гонки?) - PullRequest
0 голосов
/ 14 февраля 2012

При отслеживании нескольких файлов в C / C ++ с использованием inotify, существует ли риск возникновения состояния гонки, когда вы читаете до конца файла, а затем файл записывается перед началом опроса?

Соответствующий фрагмент кода начинается следующим образом:

while (true) {
  struct pollfd pfd = { fd, POLLIN, 0 };
  int ret = poll(&pfd, 1, 30000);  // timeout 30s
  if (ret > 0) {
    size_t len = read(fd, buf, sizeof(buf));

    for (size_t e = 0; e < len; ) {
      inotify_event *ev = reinterpret_cast<inotify_event*>(&buf[e]);

      int i = 0;
      while (wds[i] != ev->wd) {
        ++i;
      }

      if (ev->mask & IN_MODIFY) {
        FILE* f = ff[i];
        fseek(f, pos[i], SEEK_SET);

        while (fgets(line[i]+offsets[i], MAX_LINE_LENGTH, f)) {

Функция опроса возвращается только при изменении файла?Так что же произойдет, если произойдет следующая последовательность:

  1. опрос возвращает файл сигнализации, который был добавлен в
  2. Я читаю до конца файла
  3. , затем файл получаетдобавлен в
  4. , затем я начну опрашивать

Буду ли я застревать, пока файл не будет добавлен еще раз?Поскольку функция inotify_add_watch принимает только имена файлов, она не знает, где я «остановился»?

1 Ответ

1 голос
/ 14 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...