Якщо виконаний код у файлі повинен бути заблокований чи ні - це рішення проекту, і MS просто вирішила заблокувати, оскільки це має очевидні переваги на практиці: Таким чином, вам не потрібно знати, який код у якій версії використовується яким додатком. Це головна проблема поведінки за замовчуванням Linux, яку більшість людей просто ігнорує. Якщо загальносистемні бібліотеки замінено, ви не зможете легко дізнатись, які програми використовують код таких бібліотек. Найчастіше найкраще, що ви можете отримати, - це те, що менеджер пакетів знає деяких користувачів цих бібліотек і перезапускає їх. Але це працює лише для загальних і добре відомих речей, таких як, можливо, Postgres та його бібліотеки чи подібні. Більш цікаві сценарії, якщо ви розробляєте свій власний додаток для деяких сторонніх бібліотек, і їх замінюють, оскільки більшість випадків менеджер пакунків просто не знає вашого додатка. І це ' Це проблема не тільки власного коду C або подібного, це може трапитися майже з усім: просто використовуйте httpd з mod_perl та деякими бібліотеками Perl, встановленими за допомогою менеджера пакунків, і нехай менеджер пакетів оновлює ці бібліотеки Perl з будь-якої причини. Він не перезапустить ваш httpd, просто тому, що не знає залежностей. Існує безліч прикладів, подібних до цього, просто тому, що будь-який файл потенційно може містити код, який використовується в пам’яті будь-яким середовищем виконання, подумайте про Java, Python та всі подібні речі.
Тож є вагома причина думати, що блокування файлів за замовчуванням може бути хорошим вибором. Однак вам не потрібно погоджуватися з цими причинами.
То що зробив РС? Вони просто створили API, який надає програмі, що викликає, можливість вирішити, чи слід блокувати файли чи ні, але вони вирішили, що значення цього API за замовчуванням полягає у забезпеченні ексклюзивного блокування для першої програми, що викликає. Погляньте на API навколо CreateFile та його dwShareMode
аргументи. Саме тому у вас може не бути можливості видалити файли, що використовуються якимось додатком, він просто не дбає про ваш варіант використання, використовував значення за замовчуванням і, отже, отримав ексклюзивне блокування Windows для файлу.
Будь ласка, не вірте тим, що люди, які говорять вам щось про Windows, не використовують перерахування посилань на HANDLE або не підтримують жорсткі посилання або подібні, що є абсолютно неправильним. Майже кожен API, який використовує HANDLEs, документує свою поведінку щодо підрахунку реф., І ви можете легко прочитати майже в будь-якій статті про NTFS, що він фактично підтримує жорсткі посилання і завжди. Починаючи з Windows Vista, він також підтримує символічні посилання, а підтримку твердих посилань покращено завдяки наданню API для зчитування всіх даних для певного файлу тощо.
Крім того, ви можете просто захотіти поглянути на структури, що використовуються для опису файлу, наприклад, у Ext4, порівняно із структурами NTFS , які мають багато спільного. Обидва вони працюють з концепцією extents, яка відокремлює дані від таких атрибутів, як ім'я файлу, а inodes - це в основному просто інша назва для більш старої, але подібної концепції цього. Навіть Вікіпедія перераховує обидві файлові системи у своїй статті .
Насправді багато FUD щодо блокування файлів у Windows, порівняно з іншими ОС в мережі, як і дефрагментація. Дещо з цього FUD можна виключити, просто прочитавши трохи у Вікіпедії .