Подтвердить что ты не робот

Как команды UNIX mv и rm работают с открытыми файлами?

Если я читаю файл, хранящийся в файловой системе NTFS, и я пытаюсь переместить/переименовать этот файл, пока он все еще читается, мне мешают это делать. Если я попробую это в файловой системе UNIX, такой как EXT3, это будет успешным, и процесс, выполняющий чтение, не будет затронут. Я могу даже rm файл, и процессы чтения не затронуты. Как это работает? Может ли кто-нибудь объяснить мне, почему это поведение поддерживается в файловых системах UNIX, но не в NTFS? У меня есть смутное чувство, что это связано с жесткими ссылками и инодами, но я был бы признателен за хорошее объяснение.

4b9b3361

Ответ 1

Unix файловые системы используют подсчет ссылок и двухуровневую архитектуру для поиска файлов.

Имя файла относится к названию inode, для информации node или index node. Индекс хранит (указатель на) содержимое файла, а также некоторые метаданные, такие как тип файла (обычный, каталог, устройство и т.д.) И кто владеет им.

Несколько имен файлов могут ссылаться на один и тот же индекс; они затем называются жесткими ссылками. Кроме того, файловый дескриптор (fd) относится к inode. Fd - тип объекта, который получает процесс, когда он открывает файл.

Файл в файловой системе Unix исчезает только тогда, когда последняя ссылка на него исчезла, поэтому, когда больше нет имен (жестких ссылок) или fd, ссылающихся на него. Таким образом, rm фактически не удаляет файл; он удаляет ссылку на файл.

Эта установка файловой системы может показаться запутанной и иногда создает проблемы (особенно с NFS), но имеет преимущество, что блокировка не требуется для большого количества приложений. Многие программы Unix также используют эту ситуацию в своих интересах, открывая временный файл и сразу же удаляя его. Как только они завершатся, даже если они выходят из строя, временный файл пропадает.

Ответ 2

В Unix имя файла - это просто ссылка на фактический файл (inode). Открытие файла также создает (временную) ссылку на фактический файл. Когда все ссылки на файл исчезнут (rm и close()), файл удаляется.

В NTFS логически имя файла - это файл. Там нет слоя косвенности от имени файла до файла metainfo, это один и тот же объект. Если вы открываете его, он используется и не может быть удален, так же как фактический файл (inode) в unix не может быть удален во время его использования.

Unix: Имя файла ➜ FileInfo Data Данные файла

NTFS: FileName + FileInfo ➜ Данные файла