Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.107.90] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Ситуация: Мониторю папку по inotify на CLOSE_WRITE. В эту папку копируют файл, например штатным просмотрщиком файлов в Ubuntu. Копирование завершается, ловлю эвент. Открываю файл чтобы получить его размер (seek + get / fstat, не важно). Получаю размер допустим 100 байт. Закрываю файл, открываю снова, начинаю читать до конца. Оказывается что файл не 100 байт, а скажем 200. Тоесть в тот момент, когда я получил эвент о закрытии файла от инотифая, и мгновенно беру его размер, часть данных фактически ещё не сброшена на диск. Разумеется, это бывает не всегда, а "иногда". Как это побороть? Мне нужно знать точный размер файла ещё до того как начну его читать. Ubuntu 14.04 |
Сообщ.
#2
,
|
|
|
Как предположение, а если попробовать открыть и заблокировать (c LOCK_EX) и только потом, в случае успешной блокировки читать статы файла? Поэксперементируй. Вопрос интересный.
|
Сообщ.
#3
,
|
|
|
Интересное предложение, попробую
|
Сообщ.
#4
,
|
|
|
Короче, не помогает. Из идей пока только отслеживать кто открыл файл и вести его дескриптор.
Суть проблемы в том, что открывая файл после закрытия, получаем новый дескриптор, который видит только фактически доступные данные, а по старому дескриптору данные ещё висят в буфере. Контролировать процессы, которые пишут файл - нельзя, и они не используют локи. |
Сообщ.
#5
,
|
|
|
Цитата HardRock @ Короче, не помогает. Еще возможный вариант - использование fsync(). Но есть моменты, связанные c ext4 - почитай тут. Там и описание "нехороших" моментов, и пути их обхода. |
Сообщ.
#6
,
|
|
|
Цитата HardRock @ а stat(2) ?Тоесть в тот момент, когда я получил эвент о закрытии файла от инотифая, и мгновенно беру его размер, часть данных фактически ещё не сброшена на диск. а можно исходник глянуть-погонять? |