Datei während des Schreibens unter Linux lesen

9

Soweit ich weiß, erhält der Prozess, der in die Datei schreibt, beim Schreiben einer Datei eine exklusive Sperre. Daher können andere Prozesse nicht zum Lesen auf diese Datei zugreifen.

Mit den oben genannten Kenntnissen kann ich nicht verstehen, wie ich ein Video im Media Player abspielen kann, wenn der Browser es noch herunterlädt.

Sorter
quelle
1
Bitte geben Sie den Grund für die Ablehnung an. Vielen Dank.
Sortierer
2
Dies ist plattformabhängig. Geben Sie daher das Betriebssystem an, nach dem Sie fragen. Ich weiß, dass Linux keine impliziten Sperren bietet, aber Windows kann anders sein.
Amon
Ich benutze Linux
Sorter

Antworten:

13

Dein Verständnis ist falsch. Mehrere Linux-Prozesse können gleichzeitig in dieselbe Datei schreiben (und was dann passiert, ist möglicherweise nicht angegeben, außer wenn die Prozesse verschiedene Segmente dieser Datei überschreiben). Und ein anderer Linux-Prozess (z. B. Ihr Browser) kann eine Datei lesen, in die geschrieben wird .

Sie könnten eine Konvention verabschieden , um dies zu vermeiden . Zum Beispiel könnten Sie das Sperren von Beratungsdateien verwenden (wobei die Konvention übernommen wird, dass jedes relevante Programm dies tun sollte), z. B. mit flock (2) , lockf (3) usw. .... Dies verbietet jedoch keine anderen Prozesse (die nicht folgen) Ihre Konventionen), um auf diese Datei zuzugreifen (oder sogar in sie zu schreiben). Sie können Berechtigungsmaschinen verwenden (z. B. indem Sie einen Systembenutzer Ihrem Setuid- Programm widmen ).

Siehe auch diese und jene Antworten auf StackOverflow (einige von ihnen erwähnten die veralteten obligatorischen Sperrmechanismen für Linux). Informieren Sie sich über ACID- Eigenschaften und verwenden Sie eine Datenbank ( SQLite , PostGreSQL , MongoDB usw.) oder eine indizierte Datei ( GDBM ).

Ich kenne Windows nicht, habe aber das Gerücht gehört, dass es keinen gleichzeitigen Zugriff erlaubt oder nicht in dieselbe Datei schreibt.

Basile Starynkevitch
quelle
4

Die Dateien sind normalerweise nicht gesperrt - Unix-Dateisperrung . Es ist auch ziemlich üblich, mehrere Leser von Dateien zu haben, aber nur einen Schreiber. Probleme treten nur auf, wenn Sie mehrere Autoren haben würden.

Außerdem können die meisten Videodateiformate (und insbesondere im Internet) gestreamt werden, sodass Sie nicht das gesamte Video zum Abspielen benötigen.

matt.s
quelle
Probleme können auftreten, wenn Sie sich darauf verlassen, dass sich der Inhalt einer Datei zwischen den Lesevorgängen nicht ändert, z. B. wenn Sie versuchen, das Laden großer Dateien in den Speicher zu vermeiden.
yyny
2

Unix-Betriebssysteme verwenden keine obligatorische Sperrung (Gnu / Linux ist ein Unix, andere Beispiele sind UNIX, BSD, Mac OSX). Verriegelung nach Möglichkeit vermieden.

Einige andere Betriebssysteme verwenden ständig die obligatorische Sperrung (insbesondere das Windows-Betriebssystem von Microsoft). Dadurch wird die Wiedergabe gestoppt, bis der Download vollständig abgeschlossen ist. Außerdem wird das Umbenennen einer geöffneten Datei oder eines geöffneten Verzeichnisses (in dem sich eine Anwendung befindet) gestoppt. Aber unter Unix ist es OK. Wenn eine Anwendung gesperrt werden muss, kann sie verwendet werden. Aber normalerweise nicht.

Strg-Alt-Delor
quelle
Sie können festlegen, dass Dateien auch unter Windows nicht gesperrt werden. Ich spiele die ganze Zeit halb heruntergeladene Videos ab. Das Sperren ist nur für geladene ausführbare Dateien erforderlich.
CodesInChaos
@CodesInChaos Zu wahr, aber die meisten Apps werden gesperrt. Wissen Sie, ob Sie in ein Verzeichnis ohne Sperre wechseln können? Außerdem denke ich nur darüber nach, wie ausführbare Dateien unter Linux ohne Sperren funktionieren (beide Systeme verwenden nur das Laden in der Zeit, sodass Bits lange nach dem Programmstart geladen werden können), möglicherweise nutzt es seine Super-Cow-Kräfte.
Strg-Alt-Delor
1
Ich denke, der große Unterschied zwischen Linux und Windows besteht darin, dass Linux die Datei als von ihrem Dateisystemeintrag getrennt behandelt. Sie können also die Verknüpfung eines Dateinamens aufheben, während dieser geöffnet ist. Windows hingegen verzögert das Löschen, bis es geschlossen wird. Ermöglicht Linux die Änderung der Ausführung ausführbarer Dateien? Oder erlaubt es nur Löschen + Neuerstellen mit unterschiedlichen Inhalten?
CodesInChaos
@CodesInChaos Beide Ich würde mich fragen, was passieren würde, wenn Sie es ändern, nicht löschen + erstellen. Ich vermute, dass das Betriebssystem beim Laden einer App die Datei im COW-Modus (Copy On Write) öffnet. Wenn ein Prozess den Inhalt ändert, erstellt das Betriebssystem eine Kopie (der geänderten Blöcke). Eine Kopie ist mit den Prozessen verknüpft, die andere mit der Datei. Wenn alle Prozesse, die das Original verwenden, geschlossen sind, wird die Originalkopie gelöscht (da kein Dateisystemeintrag vorhanden ist). Dies ist nur eine Vermutung, basierend auf dem, was ich weiß, dass das Betriebssystem kann.
Strg-Alt-Delor