Wie erstelle ich unter Linux eine gesperrte Datei?

8

Szenario: Ich habe viele Prozesse laufen, die Dateien über das Netz abrufen müssen. Wenn die Datei bereits heruntergeladen wurde, möchte ich sie auf der Festplatte zwischenspeichern. Wenn ein anderer Prozess die Datei herunterlädt, blockieren Sie, bis das Herunterladen beendet ist.

Ich habe versucht, den einfachsten Weg dazu zu finden. Der naheliegende Weg ist:

%Vor%

Dieses System erfüllt die obigen Ziele mit (scheinbar) keinen Rennbedingungen

Leider konnte ich keine Dokumentation zur Verwendung von open () usw. finden, um eine unter Linux gesperrte Datei zu erstellen. Wenn ich den Erstellungsschritt in:

aufspalte %Vor%

Es existiert nun eine Race-Bedingung zwischen dem Create und dem Lock (der nicht-erzeugende Prozess erwirbt die Sperre, bevor der Creator dies tut).

Ich weiß, dass ich eine externe Sperrdatei pro Datei (zB Dateiname + '.lock) verwenden könnte, die ich vor dem Erstellen des Dateinamens erhalte, aber das fühlt sich unelegant an (und ich muss mir jetzt Gedanken darüber machen, wie ich das files haben eigentlich ein .lock Suffix!)

Gibt es das überhaupt, um es atomar zu erstellen und zu sperren (wie Windows anbietet) oder ist die externe Lockfile-Methode so ziemlich das, was Standard / erforderlich ist?

    
UsAaR33 27.06.2013, 20:34
quelle

2 Antworten

6

Das Rennen existiert trotzdem. Wenn die Datei vorhanden ist oder nicht existiert, müssen Sie sie testen, bevor Sie versuchen, sie zu sperren. Aber wenn die Datei Ihr Mutex ist, dann können Sie das unmöglich tun und der Abstand zwischen "if file exists" (false) und "download to new created file" ist unbeschränkt. Ein anderer Prozess könnte kommen und die Datei erstellen und den Download starten, bevor der Download beginnt, und Sie würden es überlisten.

Verwenden Sie im Prinzip keine fcntl-Sperren, verwenden Sie das Vorhandensein der Datei selbst. open() mit O_CREAT und O_EXCL wird fehlschlagen, wenn die Datei bereits existiert und Ihnen sagt, dass jemand anderes zuerst dort angekommen ist.

    
Andy Ross 27.06.2013, 20:45
quelle
0

Warum verwenden Sie kein Lockfile-Dienstprogramm?

  

Beispiele

     

Angenommen, Sie möchten sicherstellen, dass der Zugriff auf die Datei "wichtig" ist   serialisiert, d. h. es sollte nicht mehr als ein Programm oder Shell-Skript sein   erlaubt, darauf zuzugreifen. Der Einfachheit halber nehmen wir an, dass es so ist   ein Shell-Skript. In diesem Fall könnte man es so lösen:

%Vor%     
Jasio 02.09.2016 18:29
quelle

Tags und Links