Как команды UNIX mv и rm работают с открытыми файлами? - PullRequest
13 голосов
/ 07 марта 2011

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

Ответы [ 2 ]

28 голосов
/ 07 марта 2011

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

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

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

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

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

5 голосов
/ 07 марта 2011

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

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

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

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

...