@UniverseElement

Почему в Linux приложение может удалить само себя, а в Windows нет?

В Windows, при попытке приложения удалить свой исполняемый файл, мы получим ошибку "файл занят процессом", а в Linux нет (по крайней мере консольная утилита, написанная на основе .NET Core, смогла снести все свои файлы не вызвав исключения).

Хотелось бы понять разность подходов.
  • Вопрос задан
  • 1105 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Когда процесс открывает файл, он открывает дескриптор на определенную структуру данных. Эта структура содержит аттрибуты файла, права доступа, информацию о том, где хранятся данные файла и так далее.

В Win и *nix эта информация хранится в разных местах, и соответственно лок происходит по-разному.

В POSIX системах (unix, linux, etc.) информация о файле хранится iNode, а имя файла уже ссылается на iNode.

В Windows и DOS изначально информация о файле хранилась в структуре которая называется Directory Entry. В NTFS это немного изменилось, но подход они не меняли либо для обратной совместимости, либо не видели в этом нужды.

Собственно отсюда исторически и выросло, что в *nix при открытии файла дескриптор указывает на iNode, а само имя файла можно при этом свободно удалять, или делать несколько имен ссылающихся на одну iNode (hard link), которые можно произвольно менять, пока "файл открыт".

В Windows лочится непосредственно Directory Entry (или ее аналог в NTFS), следовательно его модифицировать в этот момент нельзя.

У обоих подходов есть свои плюсы и минусы и история. Пока нет предпосылок к тому, что на Windows захотят изменить подход.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@galaxy
Потому что в Windows имя файла гвоздями прибито к самому файлу, а в Linux имя - просто запись в файле директории. На хабре много лет назад была прекрасная статья про это, но я теперь не в состоянии ее найти.
Ответ написан
Комментировать
@err101
в Linux при удалении приложение(файл) остаётся в ОЗУ до перезагрузки или остановке процесса. Windows же закрывает все связанные процессы(или пытается) и удаляет файл, более не исполняемый.
Так можно удалить все корневые директории в Линукс и система будет работать, но при перезагрузке она не запустится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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