flush
и release
. Судя по описанию, обработчик flush
вызывается, когда происходит системный вызов close()
для файлового дескриптора. То есть сколько раз вызывался open()
для файла, столько же раз будет вызван close()
и, соответственно, flush
. А release
вызывается всего один раз, когда в системе не осталось больше ни одного открытого дескриптора этого файла.В описании
fuse_operations::flush
есть небольшое примечание:NOTE:The flush() method may be called more than once for each open(). (...) It is not possible to determine if a flush is final, so each flush should be treated equally. Multiple write-flush sequences are relatively rare, so this shouldn't be a problem.
На деле оказывается, что первый же вызов команды
echo
с выводом результата в файл (например, "echo blablabla >./1.txt
") приводит к следующей последовательности вызовов обработчиков: create - flush - write - flush - release
. То есть flush
вызывается два раза, причем один раз до записи данных в файл, а второй раз — после. Получается, что корректно закрыть файловый дескриптор в обработчике flush
невозможно. Как с этим бороться — непонятно. Можно, конечно, отказаться от поддержки команд, которые приводят к "multiple write-flush sequences", но так поступать не очень хочется. Поэтому пока реализовал извращение в обработчике
release
, чтобы хоть как-то обойти проблему двойного вызова flush
, а обработчик flush
остаётся пустой, потому что при таком раскладе он совершенно бесполезен.
Комментариев нет:
Отправить комментарий