"хвост" нескольких файлов в C/C++ (Linux) с помощью inotify (условие гонки?)

Когда вы настраиваете несколько файлов в 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 ответ

Решение

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

Другие вопросы по тегам