Eines der Dinge, die mich seit dem Start von Linux verwundert haben, ist die Tatsache, dass Sie den Namen einer Datei ändern oder sogar löschen können, während sie gelesen wird. Ein Beispiel ist, wie ich versehentlich versucht habe, ein Video zu löschen, während es abgespielt wurde. Ich hatte Erfolg und war überrascht, als ich erfuhr, dass Sie fast alles in einer Datei ändern können, ohne sich darum zu kümmern, ob sie gerade verwendet wird oder nicht.
operating-systems
file-management
the_midget_17
quelle
quelle
/proc
Dateisystem über das Programm, in dem es geöffnet ist, noch einen Namen hat.) Eine Datei kann nur dann wirklich gelöscht werden, wenn keine Referenzen mehr vorhanden sind, und dies geschieht automatisch.Antworten:
Wann immer Sie eine Datei in Windows öffnen oder ausführen, sperrt Windows die Datei (dies ist eine Vereinfachung, aber normalerweise wahr). Eine Datei, die durch einen Prozess gesperrt ist, kann erst gelöscht werden, wenn dieser Prozess sie freigibt. Aus diesem Grund müssen Sie jedes Mal, wenn Windows sich selbst aktualisieren muss, einen Neustart durchführen, damit die Aktualisierung wirksam wird.
Auf der anderen Seite sperren Unix-ähnliche Betriebssysteme wie Linux und Mac OS X nicht die Datei, sondern die zugrunde liegenden Festplattensektoren. Dies mag trivial erscheinen, bedeutet aber, dass der Datensatz der Datei im Inhaltsverzeichnis des Dateisystems gelöscht werden kann, ohne ein Programm zu stören, in dem die Datei bereits geöffnet ist. So können Sie eine Datei löschen, während sie noch ausgeführt oder anderweitig verwendet wird, und sie bleibt auf der Festplatte bestehen, solange ein Prozess ein offenes Handle dafür hat, obwohl der Eintrag in der Dateitabelle weg ist.
quelle
Windows verwendet standardmäßig die automatische, obligatorische Dateisperrung. UNIX verwendet standardmäßig die manuelle kooperative Dateisperrung. In beiden Fällen können die Standardeinstellungen außer Kraft gesetzt werden, in beiden Fällen jedoch normalerweise nicht.
Ein Großteil des alten Windows-Codes verwendet die C / C ++ - API (Funktionen wie
fopen
) und nicht die native API (Funktionen wieCreateFile
). Mit der C / C ++ - API können Sie nicht angeben, wie das obligatorische Sperren funktionieren soll, sodass Sie die Standardeinstellungen erhalten. Der standardmäßige "Freigabemodus" verhindert in der Regel "widersprüchliche" Vorgänge. Wenn Sie eine Datei zum Schreiben öffnen, wird davon ausgegangen, dass beim Schreiben Konflikte auftreten, auch wenn Sie nie tatsächlich in die Datei schreiben. Das Gleiche gilt für Umbenennungen.Und hier wird es noch schlimmer. Abgesehen vom Öffnen zum Lesen oder Schreiben bietet die C / C ++ - API keine Möglichkeit, anzugeben, was Sie mit der Datei tun möchten. Die API muss also davon ausgehen, dass Sie einen legalen Vorgang ausführen. Da das Sperren obligatorisch ist
open
, wird ein Vorgang , der einen Konflikt zulässt , abgelehnt, selbst wenn der Code den Konflikt niemals ausführen wollte, sondern die Datei nur für einen anderen Zweck öffnet.Wenn also Code die C / C ++ - API verwendet oder die native API verwendet, ohne sich mit diesen Problemen zu befassen, verhindern sie die maximale Anzahl möglicher Vorgänge für jede Datei, die sie öffnen, und können eine Datei nur öffnen, wenn alle möglichen Vorgänge ausgeführt werden könnte darauf ausführen, sobald geöffnet ist uneingeschränkt.
Meiner Meinung nach würde die Windows-Methode viel besser funktionieren als die UNIX-Methode, wenn jedes Programm seine Freigabemodi und Öffnungsmodi wählte und Fehlerfälle vernünftig und vernünftig handhabte. Die UNIX-Methode funktioniert jedoch besser, wenn sich der Code nicht mit diesen Problemen befasst. Leider ist die grundlegende C / C ++ - API der Windows-Datei-API nicht so gut zugeordnet, dass sie mit Freigabemodi und Konflikten beim Öffnen gut zurechtkommt. Das Nettoergebnis ist also etwas chaotisch.
quelle
Dies ist eine sehr interessante Frage, die mich zu einer brauchbaren Antwort veranlasst hat. Ich hoffe, andere können hier Unterstützung leisten.
Ich benutze sowohl Windows als auch Linux und habe dies auch bemerkt. Ich bin auch ein Benutzer von vim. Vim liest eine Textdatei in einen 'Puffer' oder den RAM und berührt die eigentliche Datei erst dann, wenn Sie sie speichern. Linux führt diese Aktion möglicherweise generell für alle Dateien aus.
Nehmen Sie Ihr Video zum Beispiel, es liest das gesamte Video, wenn möglich, in den RAM, und Sie haben dann eine Kopie des Videos, die leicht zugänglich, suchbar und überspringbar ist. Wenn die Datei zu groß ist, können Probleme auftreten, da Linux möglicherweise nicht das gesamte Video liest, möglicherweise nur einen großen Teil. Wenn Ihr Player das Ende des gepufferten Videos erreicht, versucht er, die Datei erneut zu lesen. Wenn du das Video gelöscht hast, ist das schade für dich.
Windows ist in einigen Fällen ein viel 'sichereres' Betriebssystem, da Sie dies nicht zulassen. Es puffert die Dateien möglicherweise auf die gleiche Weise wie Linux, fügt jedoch auch eine Dateisperrung hinzu, um zu verhindern, dass Sie oder andere Programme Dateien ändern, an denen Sie arbeiten oder die Sie anzeigen. Dies hilft dabei, die Datei intakt zu halten und zu verhindern, dass Sie oder andere Programme die Änderungen des anderen überschreiben.
quelle