Требуется сброс файла после выхода из процесса?

Я пишу файлы из одного процесса, используя open и write (т.е. прямые вызовы ядра). После записи я просто close и выхожу из приложения без сброса. Теперь приложение запускается из Python-Wrapper, который сразу после выхода из приложения считывает файлы. Однако иногда оболочка Python считывает неверные данные, как будто я все еще читаю старую версию файла (т. е. оболочка читает устаревшие данные).

Я думал, что независимо от того, записываются ли метаданные и содержимое файла на диск, видимое пользователем содержимое всегда будет действительным и непротиворечивым (т. зафиксировано на диске.) Что здесь происходит? Нужно ли синхронизировать при закрытии в моем приложении; или я могу просто ввести команду sync после запуска моего приложения из скрипта Python, чтобы гарантировать, что все было написано правильно? Это работает на ext4.

На стороне Python:

# Called for lots of files
o = subprocess.check_output (['./App.BitPacker', inputFile]) # Writes indices.bin and dict.bin
indices = open ('indices.bin', 'rb').read ()
dictionary = open ('dict.bin', 'rb').read ()

with open ('output-file', 'wb') as output:
    output.write (dictionary) # Invalid content in output-file ...
    # output-file is a placeholder, one output-file per inputFile or course

person Anteru    schedule 19.08.2014    source источник
comment
Закрытие файла должно сбросить все, а выход из приложения должен закрыть все. sync не имеет значения, поскольку Linux использует единый буферный кеш, поэтому все процессы видят одни и те же буферы ядра.   -  person Barmar    schedule 19.08.2014
comment
Таким образом, либо вы не полностью записываете данные, либо фактически не закрываете файл и не выходите из процесса, прежде чем пытаться его прочитать. Вам нужно опубликовать пример, демонстрирующий проблему, мы не можем ответить на этот абстрактный вопрос.   -  person Barmar    schedule 19.08.2014
comment
Тут я тоже озадачен, так как могу гарантировать, что файл закрыт и все данные записаны. Это буквально открывать, писать, закрывать, одно за другим.   -  person Anteru    schedule 19.08.2014
comment
Когда оболочка считывает устаревшие данные, можете ли вы убедиться, что файл действительно был обновлен?   -  person Sven Marnach    schedule 19.08.2014
comment
Оболочка вызывает subprocessed.check_output([...]), а затем считывает данные. Затем он записывает данные в другое место, и то, что оказывается там, не является тем, что записывает процесс.   -  person Anteru    schedule 19.08.2014


Ответы (1)


У меня никогда не было вашей проблемы, и я всегда находил вызов close() достаточным. Однако из записи человека на close(2):

Успешное закрытие не гарантирует, что данные были успешно сохранены на диск, так как ядро ​​откладывает запись. Файловая система не часто очищает буферы при закрытии потока. Если вам нужно быть уверенным, что данные физически сохранены, используйте fsync(2). (На данный момент это будет зависеть от аппаратного обеспечения диска.)

Поскольку на момент написания вы не включили код для процессов записи, я могу только предложить добавить вызов fsync в этот процесс и посмотреть, имеет ли это значение.

person Chilledrat    schedule 19.08.2014
comment
Кажется, я больше не могу его воспроизвести, теперь он работает с любым. Спасибо за разъяснение, приняв этот ответ, так как, похоже, нет необходимости в какой-либо специальной обработке. - person Anteru; 19.08.2014