Что Linux делает по-другому, который позволяет мне удалять/заменять файлы, где Windows жаловался бы, что файл используется в настоящее время?

Я думаю, что stopmotion является техникой, которую Вы ищете. После короткого поиска я нашел это применение, возможно, это могло бы помочь Вам. Но я предполагаю, что вокруг существует несколько других подобных инструментов.

31
27.09.2012, 19:39
1 ответ

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

Файл сохранен на диске в многоуровневой названной структуре i-node. Каждый i-узел имеет уникальное число в единственной файловой системе. Структура i-узла хранит другую информацию о файле, как его размер, блоки данных выделенный для файла и т.д., но ради этого ответа самый важный элемент данных является a link counter. directories файлы, которые ведут учет о файлах. Каждая запись имеет число i-узла, которое она отсылает к, длина имени файла и само имя файла. Эта схема позволяет иметь 'указатели', т.е. 'ссылки' на тот же файл в различных местах с различными именами. Счетчик ссылки i-узла на самом деле сохраняет количество ссылок, которые относятся к этому i-узлу.

Что происходит, когда некоторый процесс открывает файл? Сначала open() функционируйте ищет запись файла. Затем это проверяет, существует ли структура i-узла в оперативной памяти для этого i-узла уже. Это может произойти, если некоторому приложению уже открыли этот файл. Иначе система инициализирует новую структуру i-узла в оперативной памяти. Затем система увеличивает структуру i-узла в оперативной памяти открытый счетчик и возвращает приложению его дескриптор файла.

Вызов библиотеки Linux для удаления файла называют unlink. Эта функция удаляет запись файла из каталога и постепенно уменьшает счетчик ссылки i-узла. Если система нашла, что структура i-узла в оперативной памяти существует, и ее открытый счетчик не является нулем затем, этот вызов возвращает управление приложению. Иначе это проверяет, стал ли счетчик ссылки нулем и если это делает затем систему, освобождает все блоки, выделенные для i-узла и самого i-узла, и возвращается к приложению.

Что происходит, что приложение закрывает файл? Функция close() постепенно уменьшает открытый счетчик и проверяет его значение. Если значение является ненулевым, функция возвращается к приложению. Иначе это проверяет, является ли счетчик ссылки i-узла нулем. Если это - нуль, это освобождает все блоки файла и i-узла прежде, чем возвратиться к приложению.

Этот механизм позволяет Вам "удалять" файл, в то время как он открыт. В то же время приложение, которое открыло файл все еще, имеет доступ к данным в файле. Так, JRE, в Вашем примере, все еще сохраняет свою версию файла открытой, в то время как существуют другой, обновленная версия на диске.

Больше эта функция позволяет Вам обновлять glibc (libc) - оперативную библиотеку всех приложений - в Вашей системе, не прерывая ее нормальное функционирование.

Windows

20 лет назад мы не знали никакую другую файловую систему, чем FAT под DOS. Эта файловая система имеет другую структуру и принципы управления. Эти принципы не позволяют Вам удалять файл, когда он открыт, таким образом, DOS и в последнее время Windows должны отклонить, любой удаляет запросы на файле, который открыт. Вероятно, NTFS позволил бы то же поведение, как *отклоняют файловые системы, но Microsoft решила поддержать обычное поведение удаления файла.

Это - ответ. Не короткий, но теперь у Вас есть идея.

Править: Хорошее чтение на источниках Win32 путаница: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/? Кредиты p=38993 к @Jon

36
27.01.2020, 19:38
  • 1
    Испытанный переименовывающий сменный файл, в то время как выполнение сервера: i.imgur.com/xibyF.png –  MetaGuru 27.09.2012, 21:32
  • 2
    открытое cmd окно, изменитесь на этот каталог и использование ren MonsterB.jar MonsterB.ja_ - это должно работать. Это работает на dll и EXE-файлы определенно. –  Serge 27.09.2012, 21:36
  • 3
    не, Windows отображает части исполняемого файла в Работы памяти –  Serge 27.09.2012, 22:12
  • 4
    NTFS на самом деле поддерживает его, но Библиотека C fopen вызовы команды CreateFile с FILE_SHARE_DELETE флаг, таким образом, это запрещает его для большинства программ, это открывает файлы. –  Random832 17.10.2012, 18:25
  • 5
    Обязательная ссылка Raymond Chen: blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 –  Jon 12.09.2016, 12:57

Теги

Похожие вопросы