Сохраняются ли в Windows блокировки файлов после завершения процесса через taskkill?

1974
The Coordinator

Мы не говорим о перезагрузке / перезагрузке здесь (похоже на другой вопрос). Этот вопрос отличает способ, которым 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
Я согласен, вопросы немного отличаются. Однако информация с сайта http://superuser.com/a/918448/401839 отвечает на оба вопроса. Причина, по которой Windows работает таким образом при перезагрузке, - в основном причина, по которой Windows работает таким образом, когда программа завершается. TOOGAM 8 лет назад 0
Если вы убьете процесс, то тот процесс, у которого была блокировка файла, больше не существует. Так что нечего блокировать файл. Ramhound 8 лет назад 0

1 ответ на вопрос

3
Karan

Yes, the locks remain but you cannot predict when they will get released by the OS. See LockFile() and LockFileEx():

If a process terminates with a portion of a file locked or closes a file that has outstanding locks, the locks are unlocked by the operating system. However, the time it takes for the operating system to unlock these locks depends upon available system resources. Therefore, it is recommended that your process explicitly unlock all files it has locked when it terminates. If this is not done, access to these files may be denied if the operating system has not yet unlocked them.

Теперь это было полезно. Потому что в нашем случае система никогда не будет освобождаться до перезагрузки. Так что «зависит от доступных системных ресурсов» действительно означает «не рассчитывайте на это» :) И это объясняет некоторые вещи. The Coordinator 8 лет назад 0
@SaintHill: Вопрос в том, почему вы убиваете столько задач, которые удерживают блокировки с помощью taskkill (или делают это часто даже с несколькими задачами), что это становится серьезной проблемой? Karan 8 лет назад 0
потому что наш веб-сервер порождает специальный процесс базы данных, который запускается, а затем возвращает специальный запрос. Только один может работать одновременно, и он также блокирует несколько файлов при запуске. Но если время ожидания истекло, тогда мы должны его убить. Таким образом, веб-сервер убивает его «taskkill», а затем ... ОС часто не снимает блокировки. И многие другие процессы также разделяют эти блокировки базы данных. Итак ... нам нужно будет найти лучшее решение этой проблемы. По крайней мере, теперь мы понимаем спецификацию. The Coordinator 8 лет назад 0
@SaintHill: Понял. Да, вам определенно придется переосмыслить процесс. Karan 8 лет назад 0
Так что же происходит, если файл заблокирован на сетевом ресурсе? The Coordinator 8 лет назад 0
Очевидно, что ОС системы, к которой вы подключены, освободит блокировку по своему усмотрению, когда обнаружит, что, возможно, не было связи с программой в течение некоторого установленного периода времени. Karan 8 лет назад 0
Просто добавил тест. Различное поведение в зависимости от подсказки cmd или процесса clickkec. Нажатая блокировка не сдается до перезагрузки ... The Coordinator 8 лет назад 0