我们这里不讨论重新启动/重启(类似于另一个问题)。这个问题区分了 Windows 处理 taskkill 上现有文件锁定的方式与响应关机/重启的方式的不同。
如果我强制终止一个程序,它锁定的文件是否仍然保持锁定状态,或者当进程死亡时锁是否会被释放?
强制终止的意思是,例如使用任务管理器中的“taskkill”命令或“结束进程树”。
进一步说明一下,我指的不是留下未移除的常驻辅助锁定文件的进程,例如 MS Word。我指的是实际独占或共享文件锁定的状态。
taskkill 会释放文件锁吗?还是说文件锁会一直保持到重新启动或管理员用户在计算机管理控制台内执行操作时为止?
以下是我可以确认的 - 终止一个放置独占锁的 16 位进程
这是使用一个小型控制台程序对同一本地目录中的文件设置独占锁。该程序保持运行,直到用户按下某个键,然后它将解锁文件。以下是发生的事情:
如果在命令提示符下启动并在任务管理器中终止,它会释放锁。要终止的进程是启动该程序的特定 cmd.exe。终止它会释放锁。
如果通过单击启动,然后通过关闭窗口终止,则锁定被释放。
但是,如果通过单击然后终止任务管理器中的 conhost.exe 来启动,它不会释放锁。在这种情况下,也没有 cmd.exe,因为它被单击了。因此,终止它的唯一方法是通过终止它正在运行的 conhost.exe 或 ntvdm.exe。锁会一直保留到重新启动后。
如果通过单击启动然后终止任务管理器中的 ntvdm.exe,它会释放锁。
独占锁定实际上不会阻止文件被删除。但是,在锁定期间,Windows 不允许在资源管理器中复制文件。
因此,根据任务是通过 cmd 提示符启动还是通过单击并终止 conhost 或 ntvdm 子系统启动,会出现两种不同的行为。当然,终止 ntvdm.exe 子系统也会终止 ntvdm 线程中正在执行任务的任何其他进程。