Мы не говорим здесь о перезагрузке/перезагрузке (похоже на другой вопрос). Этот вопрос различает разный способ, которым Windows обрабатывает существующие блокировки файлов в taskkill, по сравнению с тем, как она реагирует на выключение/перезагрузку.
Если яубить силойпрограмма, останутся ли заблокированные ею файлы заблокированными или блокировки будут сняты, когда процесс завершится?
Под принудительным завершением я подразумеваю использование команды «taskkill» или «завершить дерево процессов» в диспетчере задач.
Для дальнейшего уточнения, я не говорю о процессе, оставляющем резидентный неудаляемый вспомогательный файл блокировки, как это делает MS Word. Я говорю о статусе фактической исключительной или общей блокировки файла.
Снимает ли taskkill блокировку файла? Или блокировка остается до перезагрузки или до тех пор, пока не будет выполнено действие администратора в консоли управления компьютером?
Вот что я могу подтвердить - завершение 16-битного процесса, который устанавливает исключительную блокировку
Это использование небольшой консольной программы, которая устанавливает исключительную блокировку на файл в том же локальном каталоге. Программа остается запущенной, пока пользователь не нажмет клавишу, а затем она разблокирует файл. Вот что происходит:
Если запустить его в командной строке и убить в диспетчере задач, он снимает блокировку. Процесс для убийства — это конкретный cmd.exe, который запустил программу. Его убийство снимает блокировку.
Если запустить его щелчком мыши, а затем закрыть, закрыв окно, то блокировка снимается.
Однако, если запустить его, щелкнув и затем ликвидировав conhost.exe в диспетчере задач, он не снимает блокировку. В этом случае также нет cmd.exe, потому что он был ликвидирован. Поэтому единственный способ его ликвидировать — это ликвидировать conhost.exe или ntvdm.exe, в которых он запущен. Блокировка остается на месте до перезагрузки.
Если запустить ntvdm.exe, щелкнув и удалив его в диспетчере задач, блокировка снимается.
Эксклюзивная блокировка ни в коем случае не препятствует удалению файла. Однако Windows не позволяет копировать файл в проводнике, пока действует блокировка.
Итак, два разных поведения в зависимости от того, запущена ли задача через командную строку или через нажатие и завершение работы подсистемы conhost или ntvdm. Конечно, завершение работы подсистемы ntvdm.exe также завершает работу любых других процессов, запущенных в потоке ntvdm.
решение1
Да, блокировки остаются, но вы не можете предсказать, когда ОС их снимет. СмотритеLockFile()иLockFileEx():
Если процесс завершается с заблокированной частью файла или закрывает файл, имеющий неурегулированные блокировки, блокировки разблокируются операционной системой. Однако время, необходимое операционной системе для разблокировки этих блокировок, зависит от доступных системных ресурсов. Поэтому рекомендуется, чтобы ваш процесс явно разблокировал все заблокированные им файлы при завершении. Если этого не сделать, доступ к этим файлам может быть запрещен, если операционная система еще не разблокировала их.