Как известно, нельзя удалять exe или dll файлы, которые на данный момент загружены для исполнения какого-либо процесса.
Но, оказывается, их можно переименовать и заменить новыми файлами с такими же именами! Причем можно даже из этого же самого процесса (привет барону Мюнхгаузену).
Вот ведь чудеса логики....
CM>Как известно, нельзя удалять exe или dll файлы, которые на данный момент загружены для исполнения какого-либо процесса. CM>Но, оказывается, их можно переименовать и заменить новыми файлами с такими же именами! Причем можно даже из этого же самого процесса (привет барону Мюнхгаузену). CM>Вот ведь чудеса логики....
T>>Хорошая защита от случайного удаления. CM>Нафига?
Допустим ты запустил установщик который сначала удаляет, а потом ставит новую версию. Установщик пытается удалить файл, не вышло — значит программа запущена.
Можно попросить пользователя сначала закрыть программу.
Здравствуйте, turbocode, Вы писали:
T>Установщик пытается удалить файл
.. потом пытается удалить другой, третий, удаляет все, что не залочено, а потом кричит "караул, не знаю что делать". Кривые установщики обычно так делают.
T>Можно попросить пользователя сначала закрыть программу.
А использовать мютекс или посмотреть список процессов не судьба?
T>>Установщик пытается удалить файл CM>.. потом пытается удалить другой, третий, удаляет все, что не залочено, а потом кричит "караул, не знаю что делать". Кривые установщики обычно так делают.
Можно начать удаление с главного процесса.
T>>Можно попросить пользователя сначала закрыть программу. CM>А использовать мютекс или посмотреть список процессов не судьба?
Установщики как правило имеют очень ограниченные возможности.
T>>Установщики как правило имеют очень ограниченные возможности. CM>Ну допустим. А зачем тогда разрешать переименовывать и замещать? Если уж блокировать от изменений, так от любых.
Если ты уверен в том что ты делаешь то есть такая возможность это сделать.
Здравствуйте, turbocode, Вы писали:
T>Допустим ты запустил установщик который сначала удаляет, а потом ставит новую версию. Установщик пытается удалить файл, не вышло — значит программа запущена. T>Можно попросить пользователя сначала закрыть программу.
Здравствуйте, CoderMonkey, Вы писали:
CM>Как известно, нельзя удалять exe или dll файлы, которые на данный момент загружены для исполнения какого-либо процесса.
Они мапятся в память CM>Но, оказывается, их можно переименовать и заменить новыми файлами с такими же именами! Причем можно даже из этого же самого процесса (привет барону Мюнхгаузену).
Содержимое файла требуется, что бы при нужде подгрузить страницы отсутствующее/вытесненные из памяти. А для этого надо что бы файл на диске лежал, а под каким именем не важно. CM>Вот ведь чудеса логики....
Система накладывает минимальные ограничения, необходимые для своей работы.
Здравствуйте, CoderMonkey, Вы писали:
CM>Как известно, нельзя удалять exe или dll файлы, которые на данный момент загружены для исполнения какого-либо процесса. CM>Но, оказывается, их можно переименовать и заменить новыми файлами с такими же именами! Причем можно даже из этого же самого процесса (привет барону Мюнхгаузену). CM>Вот ведь чудеса логики....
Логика в том, что если есть процесс, который читает из файла, то просто так делать открытый файловый дескриптор недействительным нельзя — большинство приложений эту ситуацию не обрабатывают и могут просто упасть.
В линуксе еще веселее — файл удалить можно, но на диске он останется, пока не закроются все процессы, которым он нужен.
Здравствуйте, scf, Вы писали:
scf>В линуксе еще веселее — файл удалить можно, но на диске он останется, пока не закроются все процессы, которым он нужен.
Это потому что там удаление это unlink — inode отцепляется от namespace
Здравствуйте, CoderMonkey, Вы писали:
CM>Как известно, нельзя удалять exe или dll файлы, которые на данный момент загружены для исполнения какого-либо процесса. CM>Но, оказывается, их можно переименовать и заменить новыми файлами с такими же именами! Причем можно даже из этого же самого процесса (привет барону Мюнхгаузену). CM>Вот ведь чудеса логики....
Всё как раз очень логично. "Загруженные" файлы на самом деле не загружены, а отображены в память процесса. И что бы эта система работала дальше — сам файл должен быть.
А как он называется — дело десятое.
Здравствуйте, CoderMonkey, Вы писали:
CM>Вот ведь чудеса логики....
Как то этот пост совершенно не матчится с понтокиданием в соседней ветке про юнит тестирование, я бы сказал чудеса несоответствия понтов внезапным "чудесным открытиям".
Здравствуйте, CreatorCray, Вы писали:
scf>>В линуксе еще веселее — файл удалить можно, но на диске он останется, пока не закроются все процессы, которым он нужен. CC>Это потому что там удаление это unlink — inode отцепляется от namespace
А если выключим питание в этот момент, система добьёт зомби файл на диске при следующем включении?