23

С тех пор, как я начал использовать Linux, меня озадачило то, что он позволяет вам изменять имя файла или даже удалять его во время чтения. Например, как я случайно попытался удалить видео во время его воспроизведения. Я преуспел и был удивлен, когда узнал, что вы можете изменить практически все в файле, не заботясь о том, используется ли он в данный момент или нет.

3 ответа3

35

Каждый раз, когда вы открываете или запускаете файл в Windows, Windows блокирует файл на месте (это упрощение, но обычно это так). Файл, заблокированный процессом, не может быть удален, пока этот процесс не освободит его. Вот почему всякий раз, когда Windows должна обновлять себя, вам требуется перезагрузка, чтобы она вступила в силу.

С другой стороны, Unix-подобные операционные системы, такие как Linux и Mac OS X, блокируют не файл, а базовые сектора диска. Это может показаться тривиальным отличием, но это означает, что запись файла в оглавлении файловой системы может быть удалена, не мешая любой программе, в которой уже открыт файл. Таким образом, вы можете удалить файл, когда он все еще выполняется или иным образом используется, и он будет продолжать существовать на диске, пока какой-то процесс имеет открытый дескриптор для него, даже если его запись в таблице файлов отсутствует.

10

В Windows по умолчанию установлена автоматическая обязательная блокировка файлов. В UNIX по умолчанию используется ручная кооперативная блокировка файлов. В обоих случаях значения по умолчанию могут быть переопределены, но в обоих случаях обычно нет.

Большая часть старого кода Windows использует API C/C++ (функции, такие как fopen), а не нативный API (функции, такие как CreateFile). API C/C++ не позволяет указать, как будет работать обязательная блокировка, поэтому вы получите значения по умолчанию. "Режим совместного использования" по умолчанию запрещает "конфликтующие" операции. Если вы открываете файл для записи, считается, что запись конфликтует, даже если вы никогда не выполняете запись в файл. То же самое для переименований.

И вот где это становится хуже. Кроме открытия для чтения или записи, API C/C++ не предоставляет способа указать, что вы собираетесь делать с файлом. Поэтому API должен предполагать, что вы собираетесь выполнять какие-либо законные операции. Поскольку блокировка является обязательной, в open которое разрешает конфликтующую операцию, будет отказано, даже если код никогда не предназначался для выполнения конфликтующей операции, а просто открывал файл для другой цели.

Таким образом, если код использует API C/C++ или использует нативный API, не задумываясь об этих проблемах, он будет предотвращать создание максимального набора возможных операций для каждого файла, который они открывают, и не сможет открыть файл, если только не будут выполнены все возможные операции. может выступать на нем, когда открыт, не конфликтует.

По моему мнению, метод Windows работал бы намного лучше, чем метод UNIX, если бы каждая программа выбирала свои режимы общего доступа и открытые режимы, мудро и разумно обрабатывая случаи сбоев. Однако метод UNIX работает лучше, если код не задумывается над этими проблемами. К сожалению, базовый API C/C++ плохо отображается на файловый API Windows таким образом, что обрабатывает режимы совместного использования и конфликты открываются хорошо. Таким образом, чистый результат немного грязный.

0

Это очень интересный вопрос, и он заставил меня задуматься над реальным ответом. Я надеюсь, что другие могут предоставить резервную копию здесь.

Я использую как Windows, так и Linux, и это тоже заметил. Я также пользователь vim. Vim будет читать текстовый файл в «буфер» или в ОЗУ, а затем не будет касаться реального файла, пока вы не сохраните. Linux может выполнять такие действия со всеми файлами.

Возьмем, к примеру, ваше видео, оно читает все видео, если это возможно, в ОЗУ, а затем у вас есть копия видео, которая легко доступна, доступна для поиска и имеет возможность перехода. Если файл слишком большой, то у вас могут возникнуть проблемы, потому что Linux может не прочитать все видео, может быть, просто большой кусок. Когда ваш проигрыватель доберется до конца буферизованного видео, он попытается снова прочитать файл. Если вы удалили видео, то это отстой.

В некоторых случаях Windows является «более безопасной» ОС, потому что она не позволяет вам этого делать. Он может буферизовать файлы так же, как это делает Linux, но также добавляет блокировку файлов, чтобы вы или другие программы не могли изменять файлы, над которыми вы работаете или просматриваете. Это помогает сохранить файл в целости и не дает вам или другим программам перезаписывать изменения друг друга.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .