1

Мы не говорим о перезагрузке / перезагрузке здесь (похоже на другой вопрос). Этот вопрос отличает способ, которым Windows обрабатывает существующие блокировки файлов на TaskKill, и то, как он реагирует на завершение работы / перезагрузку.

Если я принудительно убью программу, останутся ли заблокированные файлы по-прежнему заблокированными или блокировки снимаются, когда процесс тоже умирает?

Под принудительным уничтожением я подразумеваю, например, использование команды taskkill или дерева конечных процессов в taskmanager.

Для дальнейшего пояснения, я не говорю о процессе, оставляющем резидентный неснятый файл вспомогательной блокировки, такой как MS Word. Я говорю о статусе фактической монопольной или общей блокировки файлов.

Taskkill освобождает блокировку файла? Или блокировка сохраняется до тех пор, пока в консоли управления компьютером не будет выполнена перезагрузка или действие администратора?

Вот что я могу подтвердить - уничтожение 16-битного процесса, который устанавливает эксклюзивную блокировку

Это использует небольшую консольную программу, которая устанавливает эксклюзивную блокировку для файла в том же локальном каталоге. Программа работает до тех пор, пока пользователь не нажмет клавишу, а затем разблокирует файл. Вот что происходит:

  • Если он запущен из командной строки и убит в диспетчере задач, он снимает блокировку. Процесс уничтожения - это конкретный cmd.exe, который запустил программу. Убив его, открой замок.

  • Если запустить, нажав, а затем убить, закрыв окно, блокировка снимается.

  • Однако, если запустить его, щелкнув, а затем убив файл conhost.exe в диспетчере задач, он не снимет блокировку. В этом случае также нет cmd.exe, потому что он был нажат. Таким образом, единственный способ убить его - убить conhost.exe или ntvdm.exe, в котором он запущен. Замок остается на месте до перезагрузки.

  • Если запустить его, щелкнув, а затем убив файл ntvdm.exe в диспетчере задач, он снимает блокировку.

  • Эксклюзивная блокировка никогда не препятствует удалению файла. Тем не менее, Windows не позволяет копировать файл в проводнике, пока блокировка установлена.

Итак, два разных поведения в зависимости от того, запускается ли задача через приглашение cmd или через нажатие и уничтожение подсистемы conhost или ntvdm. Конечно, уничтожение подсистемы ntvdm.exe также убивает все другие процессы, выполняемые в потоке ntvdm.

1 ответ1

3

Да, блокировки остаются, но вы не можете предсказать, когда они будут освобождены ОС. Смотрите LockFile() и LockFileEx():

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

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