На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> Проблемы с отложенной записью , при чтении файла
    Всем привет!

    Ситуация:
    Мониторю папку по inotify на CLOSE_WRITE.
    В эту папку копируют файл, например штатным просмотрщиком файлов в Ubuntu.

    Копирование завершается, ловлю эвент. Открываю файл чтобы получить его размер (seek + get / fstat, не важно).
    Получаю размер допустим 100 байт.
    Закрываю файл, открываю снова, начинаю читать до конца.

    Оказывается что файл не 100 байт, а скажем 200.

    Тоесть в тот момент, когда я получил эвент о закрытии файла от инотифая, и мгновенно беру его размер, часть данных фактически ещё не сброшена на диск.
    Разумеется, это бывает не всегда, а "иногда".

    Как это побороть?
    Мне нужно знать точный размер файла ещё до того как начну его читать.

    Ubuntu 14.04
    Сообщение отредактировано: HardRock -
      Как предположение, а если попробовать открыть и заблокировать (c LOCK_EX) и только потом, в случае успешной блокировки читать статы файла? Поэксперементируй. Вопрос интересный.
        Интересное предложение, попробую
          Короче, не помогает. Из идей пока только отслеживать кто открыл файл и вести его дескриптор.
          Суть проблемы в том, что открывая файл после закрытия, получаем новый дескриптор, который видит только фактически доступные данные, а по старому дескриптору данные ещё висят в буфере.
          Контролировать процессы, которые пишут файл - нельзя, и они не используют локи.
          Сообщение отредактировано: HardRock -
            Цитата HardRock @
            Короче, не помогает.

            Еще возможный вариант - использование fsync().
            Но есть моменты, связанные c ext4 - почитай тут. Там и описание "нехороших" моментов, и пути их обхода.
              Цитата HardRock @
              Тоесть в тот момент, когда я получил эвент о закрытии файла от инотифая, и мгновенно беру его размер, часть данных фактически ещё не сброшена на диск.
              а stat(2) ?
              а можно исходник глянуть-погонять?
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0233 ]   [ 16 queries used ]   [ Generated: 19.04.24, 06:55 GMT ]