Я просто переименовал файл журнала в «foo.log.old» и предположил, что приложение начнет запись нового файла журнала в «foo.log». Я был удивлен, обнаружив, что он отслеживает лог-файл с новым именем и продолжает добавлять строки в "foo.log.old".
В Windows я не знаком с таким поведением - я даже не знаю, возможно ли вообще его реализовать. Как именно это поведение реализовано в Linux? Где я могу узнать больше об этом?
files
open-files
rename
ripper234
источник
источник
Ответы:
Программы подключаются к файлам через номер, поддерживаемый файловой системой (называемый inode в традиционных файловых системах unix), имя которого является просто ссылкой (и, возможно, не уникальной ссылкой в этом случае).
Итак, несколько вещей, о которых нужно знать:
mv
этого значения не изменит этого нижележащего числа, если только вы не переместите его по файловым системам (что эквивалентно использованиюcp
затемrm
на оригинале).open
файлом, она ссылается на него, что (для целей, когда данные будут удалены) эквивалентно наличию имени файла, связанного с ней.Это вызывает несколько вариантов поведения, таких как:
open
файл для чтения, но на самом деле не читает его до тех пор, пока пользователь неrm
отредактирует его в командной строке, и программа все равно будет иметь доступ к данным .mv
использование файла не разрывает отношения между файлом и любыми программами, в которых он открыт (если вы не пересекаете границы файловой системы, в этом случае у программы все еще есть версия оригинала для работы).open
отредактировала файл для записи, и у пользователяrm
есть последнее имя файла в командной строке, программа может продолжать помещать материал в файл, но как только он закроется, больше не будет ссылок на эти данные и это уйдет.open
. (Это не настоящий разум безопасности, он просто превращает зияющую дыру в состояние гонки.)источник
open
файл для чтения и записи (как то, что произошло с файлом журнала в вопросе).Чтобы действительно увидеть, как реализовано это поведение, вы можете взглянуть на некоторые книги по программированию Unix. Mathepic прав в том, что он связан с inode. Фактическое имя пути используется только для открытия файла, как только это будет сделано, программа ссылается на него по открытому дескриптору файла. Дескриптор файла, в свою очередь, ссылается на индекс, который в данном случае не заботится об изменении имени базового файла.
Что касается реализации этого в Windows, это вопрос для другого сайта.
Чтобы узнать об этом больше, не обращая внимания на книги, просто ищите файловые системы и inode in-linux. Там может быть не четкий ответ, но вы сможете понять, почему.
источник