Bleiben Dateisperren in Windows bestehen, nachdem ein Prozess über Taskkill beendet wurde?

2109
The Coordinator

Wir sprechen hier nicht über einen Neustart / Neustart (ähnlich einer anderen Frage). Diese Frage unterscheidet die Art und Weise, wie Windows vorhandene Dateisperren für einen Taskkill verarbeitet, und nicht die Art und Weise, wie Windows auf ein Herunterfahren / Neustarten reagiert.

Wenn ich ein Programm erzwinge, bleiben die gesperrten Dateien weiterhin gesperrt, oder werden die Sperren freigegeben, wenn der Prozess ebenfalls abbricht?

Mit erzwungener Tötung meine ich beispielsweise den Befehl 'Taskkill' oder 'Prozessbaum beenden' im Taskmanager.

Um dies weiter zu verdeutlichen, spreche ich nicht von einem Prozess, der eine residente, entfernte Hilfssperrdatei verlässt, wie beispielsweise MS Word. Ich spreche vom Status einer tatsächlichen exklusiven oder gemeinsam genutzten Dateisperre.

Gibt Taskkill einen Filelock frei? Oder bleibt die Sperre so lange bestehen, bis in der Computerverwaltungskonsole ein Neustart oder eine Administratoraktion ausgeführt wird?

Folgendes kann ich bestätigen - einen 16-Bit-Prozess beenden, der eine exklusive Sperre setzt

Hierbei wird ein kleines Konsolenprogramm verwendet, mit dem eine Datei in demselben lokalen Verzeichnis exklusiv gesperrt wird. Das Programm bleibt so lange aktiv, bis der Benutzer eine Taste drückt und dann die Datei entsperrt. Folgendes passiert:

  • Wenn es an der Eingabeaufforderung gestartet und im Taskmanager beendet wird, gibt es die Sperre auf. Der Prozess, der beendet werden soll, ist die spezifische cmd.exe, mit der das Programm gestartet wurde. Durch das Töten wird die Sperre aufgehoben.

  • Wenn Sie durch Klicken auf klicken und das Fenster schließen, wird die Sperre aufgehoben.

  • Wenn sie jedoch durch Klicken auf und anschließendes Beenden der conhost.exe im Taskmanager gestartet wird, wird die Sperre nicht aufgehoben. In diesem Fall gibt es auch keine cmd.exe, da darauf geklickt wurde. Die einzige Möglichkeit, es zu töten, besteht darin, die Datei conhost.exe oder ntvdm.exe zu töten. Die Sperre bleibt bis zum Neustart bestehen.

  • Wenn sie durch Klicken auf und Entfernen der Datei ntvdm.exe im Taskmanager gestartet wird, wird die Sperre aufgehoben.

  • Die exklusive Sperre verhindert zu keinem Zeitpunkt, dass die Datei gelöscht wird. Windows erlaubt jedoch nicht, dass die Datei im Explorer kopiert wird, während die Sperre aktiviert ist.

Zwei unterschiedliche Verhaltensweisen hängen davon ab, ob die Task über die Eingabeaufforderung "cmd" oder durch Klicken und Abbruch des Conhost- oder NTTVM-Subsystems gestartet wird. Durch das Beenden des Subsystems ntvdm.exe werden natürlich auch alle anderen Prozesse abgebrochen, die im ntvdm-Thread ausgeführt werden.

1
Ich stimme zu, die Fragen sind etwas anders. Die Informationen von http://superuser.com/a/918448/401839 beantworten jedoch beide Fragen. Der Grund, warum Windows beim Neustart so funktioniert, ist im Wesentlichen der Grund, warum Windows beim Beenden eines Programms so funktioniert. TOOGAM vor 9 Jahren 0
Wenn Sie einen Prozess beenden, ist der Prozess mit der Dateisperre nicht mehr vorhanden. Die Datei kann also nicht gesperrt werden. Ramhound vor 9 Jahren 0

1 Antwort auf die Frage

3
Karan

Ja, die Sperren bleiben erhalten, aber Sie können nicht vorhersagen, wann sie vom Betriebssystem freigegeben werden. Siehe LockFile () und LockFileEx () :

Wenn ein Prozess mit einem gesperrten Teil einer Datei beendet wird oder eine Datei mit ausstehenden Sperren geschlossen wird, werden die Sperren vom Betriebssystem entsperrt. Die Zeit, die das Betriebssystem benötigt, um diese Sperren aufzuheben, hängt jedoch von den verfügbaren Systemressourcen ab. Daher wird empfohlen, dass Ihr Prozess alle Dateien, deren Sperrung er beendet hat, beim Beenden explizit aufhebt. Andernfalls wird der Zugriff auf diese Dateien möglicherweise verweigert, wenn das Betriebssystem sie noch nicht entsperrt hat.

Das war jetzt nützlich. Denn in unserem Fall wird das System niemals bis zum Neustart freigegeben. "Abhängig von verfügbaren Systemressourcen" heißt also "nicht darauf zählen" :) Und das erklärt einige Dinge. The Coordinator vor 9 Jahren 0
@SaintHill: Die Frage ist, warum töten Sie so viele Aufgaben, die Sperren mit Taskkill halten (oder häufig sogar mit ein paar Aufgaben), dass dies zu einem großen Problem wird? Karan vor 9 Jahren 0
weil unser Webserver einen speziellen Datenbankprozess erzeugt, der ausgeführt wird und dann eine spezielle Abfrage zurückgibt. Nur eine kann gleichzeitig ausgeführt werden, und es sperrt auch mehrere Dateien, wenn es ausgeführt wird. Aber wenn es Zeitüberschreitung hat, müssen wir es töten. Der Webserver tötet es also 'taskkill' und dann ... das Betriebssystem gibt die Sperren oft nicht frei. Und viele andere Prozesse teilen auch diese Datenbanksperren. Wir müssen also nach einer besseren Lösung für dieses Problem suchen. Zumindest verstehen wir die Spezifikation jetzt. The Coordinator vor 9 Jahren 0
@ SaintHill: Verstanden. Ja, Sie müssen den Prozess auf jeden Fall überdenken. Karan vor 9 Jahren 0
Was passiert also, wenn die Datei auf einer Netzwerkfreigabe gesperrt ist? The Coordinator vor 9 Jahren 0
Wenn das Betriebssystem des Systems, mit dem Sie verbunden sind, begründet wird, wird die Sperre nach Belieben freigegeben, wenn möglicherweise erkannt wird, dass das Programm über einen bestimmten Zeitraum keine Kommunikation mit dem Programm ausgeführt hat. Karan vor 9 Jahren 0
Fügte gerade einen Test hinzu. Unterschiedliches Verhalten abhängig von der Eingabeaufforderung oder dem Clickec-Prozess. Die angeklickte Sperre gibt erst nach dem Neustart auf ... The Coordinator vor 9 Jahren 0