Sperren Ausführen von Dateien: Windows funktioniert, unter Linux nicht. Warum?
Ich bemerkt, wenn eine Datei ausgeführt wird, auf Windows (.exe-oder .dll), ist Sie gesperrt und kann nicht gelöscht werden, verschoben oder geändert werden.
Linux, auf der anderen Seite nicht sperren ausführen von Dateien, und Sie kann löschen, verschieben oder ändern Sie Sie.
Warum Windows sperren, wenn Linux nicht? Ist es ein Vorteil zu sperren?
- Es gibt ein Programm namens WhoLockMe fügt einen Menü-Eintrag, um das Kontextmenü im explorer die Anzeige der Prozess - (es -) sperren einer bestimmten Datei. Sehr nützlich, wenn Sie erhalten seltsame Datei-locking-Fehler. Edit: ich weiß, dass dies keine Antwort auf die Frage, aber ich dachte, es war nützlich genug, im Kontext zu rechtfertigen eine separate Antwort (wie oppposed nur ein Kommentar).
InformationsquelleAutor David Lenihan | 2008-10-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Linux hat einen reference-count-Mechanismus, so können Sie löschen Sie die Datei, während er ausgeführt wird, und es wird auch weiterhin so lange existieren, wie einige Prozesse (Die bereits geöffnet wurde) hat einen offenen Griff für Sie. Der directory-Eintrag für die Datei wird entfernt, wenn Sie es löschen, es kann also nicht geöffnet werden, sondern Prozesse, die bereits mit dieser Datei können Sie immer noch verwenden es. Sobald alle Prozesse, die mit dieser Datei beenden, wird die Datei automatisch gelöscht.
Windows nicht über diese Funktion, so dass es gezwungen ist, die Datei sperren, bis alle Prozesse ausgeführt wird, ist es fertig.
Ich glaube, dass das Linux-Verhalten vorzuziehen ist. Es gibt wahrscheinlich einige Tiefe architektonischen Gründen, aber der wichtigste (und einfache) Grund finde ich überzeugendste ist, dass in Windows, Sie manchmal können eine Datei nicht löschen, Sie haben keine Ahnung, warum, und Sie wissen, ist, dass ein gewisser Prozess ist, halten Sie es in verwenden. In Linux ist es nie passiert.
FILE_SHARE_DELETE
- bit gesetzt ist. Ich glaube nicht, dass die PE-loader (lädt EXEs und DLLs) dieses bit setzt. Die Griffe sind in der Referenz-gezählt und auf ein löschen der Datei geht Weg, wenn der Letzte Griff ist gesunken, aber der Unterschied zwischen dass und Unix ist, dass NT-block wird eine neue Datei erstellt mit dem gleichen Namen, wenn dies geschieht.FILE_SHARE_DELETE
, einen Grabstein Eintrag Datei bleibt in dem Verzeichnis, auf das Sie nicht mehr umbenennen oder entfernen, bis die Datei tatsächlich geschlossen. So löschen einer solchen Datei wird Sie in eine sehr binden. Es ist besser, benennen Sie die Datei an einen anderen Speicherort, bevor Sie Sie löschen. (edit: ich sehe, dass Sie sagte, dass Sie in Ihrem Kommentar, sorry für den Lärm)Soweit ich weiß, linux hat Sperre ausführbare Dateien, wenn Sie ausgeführt werden-aber es sperrt die inode. Dies bedeutet, dass Sie können löschen Sie die "Datei" aber der inode ist immer noch auf dem Dateisystem, das unberührt und alles, was Sie wirklich gelöscht ist ein link.
Unix-Programme verwenden diese Art des Denkens über das Dateisystem die ganze Zeit, erstellen Sie eine temporäre Datei, öffnen Sie diese, löschen Sie den Namen. Ihre Datei ist noch vorhanden, aber der name ist frei für andere zu verwenden, und niemand sonst kann es sehen.
Linux funktioniert sperren der Dateien. Wenn Sie versuchen, eine Datei überschrieben, die Ausführung erhalten Sie "ETXTBUSY" (Text-Datei beschäftigt). Sie können jedoch, entfernen Sie die Datei, und der kernel wird die Datei gelöscht, wenn der Letzte Verweis auf Sie entfernt. (Wenn die Maschine nicht sauber Herunterfahren, diese Dateien sind die Ursache für die "Deleted inode hatte null d-time" - Nachrichten, wenn das Dateisystem wird überprüft, waren Sie nicht komplett gelöscht, weil ein laufender Prozess hatte einen Verweis auf Sie, und jetzt sind Sie.)
Dieser hat einige wichtige Vorteile, die Sie aktualisieren können, das ist ein Prozess ausgeführt wird, durch das löschen der ausführbaren Datei zu ersetzen, dann Neustart der Prozess. Auch init werden kann, wie dies aktualisiert, ersetzen Sie die ausführbare Datei, und senden ein signal, und es wird re-exec() selbst, ohne dass ein Neustart erforderlich ist. (Dies geschieht in der Regel automatisch von Ihrem Paket-management-system als Teil des upgrade -)
Unter windows eine Datei ersetzt, die verwendet wird, um einen großen Streit sein, in der Regel erfordern einen Neustart, um sicherzustellen, dass keine Prozesse ausgeführt werden.
Da kann es einige Probleme, wie wenn Sie eine sehr große Datei, und entfernen Sie es, aber vergessen zu sagen, der Prozess, der die Protokollierung auf die Datei, um die Datei erneut öffnen, werde es halten Sie den Verweis, und Sie werden sich Fragen, warum Ihre Festplatte nicht plötzlich viel mehr freien Speicherplatz.
Können Sie auch diesen trick unter linux für temporäre Dateien. öffnen Sie die Datei, löschen Sie es, dann weiter zu verwenden Sie die Datei. Wenn ein Prozess beendet (gleichgültig aus welchem Grund-auch Stromausfall), wird die Datei gelöscht.
Programme wie lsof und fuser (oder nur stochern im /proc//fd) können Sie anzeigen, welche Prozesse Dateien öffnen, die nicht mehr einen Namen haben.
Ich glaube du bist zu absolut zu Windows. Normalerweise ist es nicht zuordnen swap-space für den Programmteil einer ausführbaren Datei. Stattdessen hält eine Sperre auf die ausführbaren & DLLs. Wenn ausrangiert code-Seiten werden wieder benötigt, sind Sie einfach erneut geladen. Aber mit /SWAPRUN, diese Seiten sind gehalten, die in die swap. Dies wird benutzt, um ausführbare Dateien auf CD oder Netzwerk-Laufwerke. Daher, dass windows nicht gesperrt werden müssen diese Dateien.
Für .NET, schau Shadow Copy.
Ich denke, dass linux /unix nicht mit der gleichen locking-mechanik, weil Sie von Grund auf als multi-user-system - das erwarten würde, die Möglichkeit mehrere Nutzer mit der gleichen Datei, vielleicht sogar für verschiedene Zwecke.
Ist es ein Vorteil zu sperren? Gut, es könnte möglicherweise reduzieren die Menge der Hinweise, die das OS wäre zu verwalten, aber jetzt Tage die Höhe der Einsparungen ist ziemlich vernachlässigbar. Der größte Vorteil, den ich mir denken kann, zu sperren, ist dies: Sie sparen einige Benutzer sichtbar Mehrdeutigkeit. Wenn Benutzer a eine binäre Datei, und der Benutzer b löscht, dann die eigentliche Datei hat, um zu bleiben, bis der Benutzer Ein Prozess abgeschlossen ist. Doch, wenn Benutzer B oder andere Nutzer auf die Datei-system für Sie, werden Sie nicht in der Lage sein, um es zu finden - aber es wird weiterhin zu viel Platz einzunehmen. Nicht wirklich eine große Sorge für mich.
Ich denke, größtenteils ist es eher eine Frage zur Abwärtskompatibilität mit Fenster-Datei-Systeme.
Ausgeführt, wenn Sie code in einer Datei gesperrt werden soll oder nicht, ist eine design-Entscheidung und MS beschloss einfach zu sperren, denn es hat klare Vorteile in der Praxis: auf diese Weise brauchen Sie nicht zu wissen, welcher code in welcher version verwendet wird, durch die Anwendung. Das ist ein großes problem mit Linux-Standard-Verhalten, das wird einfach ignoriert von den meisten Menschen. Wenn die systemweite libs ersetzt werden, können Sie nicht einfach zu wissen, welche apps verwenden Sie code von solchen libs, die meisten der Zeit, die besten die Sie bekommen können ist, dass der Paket-manager kennt einige Nutzer dieser libs und neu gestartet. Aber das funktioniert nur für die Allgemeinen und gut wissen, dass Dinge wie vielleicht Postgres und seine libs oder so. Die interessantere Szenarien sind, wenn Sie entwickeln Ihre eigene Applikation gegen einige 3rd-party-libs und diese ersetzt zu bekommen, weil die meisten der Zeit, die der Paket-manager weiß einfach nicht, Ihre app. Und das ist nicht nur ein problem von nativem C-code oder so, es kann passieren, mit fast alles: nutzen Sie Einfach die httpd mit mod_perl und einige Perl-libs installiert mit einem Paket-manager und lassen Sie den Paket-manager aktualisieren diese Perl-libs aus irgendeinem Grund. Es wird nicht starten Sie Ihre httpd, einfach weil Sie nicht wissen, die Abhängigkeiten. Es gibt viele Beispiele wie dieses, einfach weil jede Datei kann potenziell enthalten code im Speicher von jeder Laufzeit, denken Sie an Java, Python und all solche Dinge.
Also es gibt einen guten Grund zu haben, die der Meinung sind, dass das sperren von Dateien standardmäßig kann eine gute Wahl sein. Sie müssen nicht Zustimmen, die Gründe, obwohl.
So was hat MS zu tun? Sie einfach erstellt ein API, das gibt die aufrufende Anwendung die Möglichkeit zu entscheiden, ob die Dateien gesperrt werden soll oder nicht, aber Sie beschlossen, dass der Standardwert für diese API ist die Bereitstellung einer exklusiven Sperre an die erste aufrufende Anwendung. Haben Sie einen Blick auf die API um CreateFile und seine
dwShareMode
argument. Das ist der Grund, warum Sie möglicherweise nicht in der Lage sein, Dateien zu löschen, die in Verwendung durch eine Anwendung, die es einfach nicht über Ihren Fall, verwendet die Standardwerte, und deshalb bekam eine exklusive sperren, die von Windows für eine Datei.Bitte glaube nicht, dass Leute sagen Sie etwas über Windows nicht verwendet ref-counting on Griffe oder keine Unterstützung von Hardlinks oder so, das ist völlig falsch. Fast jede API-Benutzung von HANDLEs auf Dokumente, die Ihr Verhalten hinsichtlich der ref zählen, und Sie können Lesen in fast jedem Artikel über NTFS, dass es in der Tat unterstützt Hardlinks und es immer Tat. Seit Windows Vista hat die Unterstützung für symbolische Links und die Unterstützung für Hardlinks wurde verbessert durch die Bereitstellung von APIs zu Lesen Sie alle von diesen für eine bestimmte Datei etc.
Darüber hinaus können Sie wollen einfach nur, um einen Blick auf Strukturen verwendet, um zu beschreiben, eine Datei in z.B. Ext4 im Vergleich zu denen der NTFS, die eine Menge gemeinsam haben. Beide arbeiten mit dem Konzept der Blöcke, trennt die Daten-Attribute wie Dateiname, und die inodes sind ziemlich viel, nur ein anderer name für einen älteren, aber ähnlichen Konzept, der. Selbst Wikipedia führt die beiden Dateisysteme in seiner Artikel.
Es gibt wirklich eine Menge FUD um die Datei sperren in Windows im Vergleich zu anderen OSs auf dem Netz, genau wie über die Defragmentierung. Einige dieser FUD ausgeschlossen werden kann, einfach durch das Lesen ein bisschen auf die Wikipedia.
WinSxS
und so Zeug. Außerdem, es geht nicht um das laden Sachen in den Speicher, und halten Sie es, Windows tut genau das, dass auch, wenn notwendig, es zu wissen und zu entscheiden, ob Dateien ersetzt werden sollen oder nicht, und wer ist verantwortlich zu entscheiden. Die Windows-API einfach können Sie die ersten Benutzer der Datei entscheiden, und das macht sehr viel Sinn.Of course a program writing to a file locks it to avoid write conflicts.
Du meinst, WENN einige user von einer Datei entscheidet, dass die gleichzeitige schreibt, sind schlecht und eine solche Entscheidung ist genau das, was MS gemacht für das Windows-Ladeprogramm und was ist genau das, was ich sagte in der Antwort, die und zu Sie in zu viele Kommentare, die bereits über und über wieder? Ich glaube, ich bin zu der Entscheidung, das langweilt mich jetzt zu viel. 🙂CreateFile
unddwShareMode
niemand zwingt Sie erwerben eine Sperre, WENN der erste Benutzer, der eine Datei ermöglicht es Ihnen zu schreiben. Umschreiben von EXEs oder DLLs, die von der gleichen app ist nicht die einzige use-case-schützt gegen beliebige ANDERE apps schreiben, um die Dateien auch durch Zufall eine gültige auch. Sie wissen einfach nicht scheinen zu verstehen, dass Sie nicht brauchen, um zu dem gleichen Schluss kommen, wie MS das gemacht hat, aber das heißt nicht, dass Ihre Forderung unbedingt falsch. Es ist einfach so, dass Sie unterschiedliche Prioritäten haben.NT-Varianten haben die
openfiles
Befehl, die zeigen, welche Prozesse haben Griffe auf die Dateien. Es erfordert aber die Aktivierung der system global flag "Objekte pflegen-Liste'
openfiles /local /?
erzählt Sie, wie Sie dies tun, und auch, dass Leistungseinbußen entstehen dadurch.
Ausführbaren Dateien schrittweise zugeordnet Arbeitsspeicher. Was das bedeutet, ist, dass Teile der ausführbaren Datei geladen, wie nötig. Wenn die Datei ist ausgelagert, vor allen Abschnitten zugeordnet wird, könnte es zu erheblichen Instabilität.