Racebedingung beim Aufruf von FSDeleteObject
-
20-09-2019 - |
Frage
Ich habe einen „sicheren Speicher“-Vorgang implementiert, der etwa so aussieht:
- Speichern Sie einige Daten in einer temporären Datei
A
- Kopieren Sie den Inhalt von
A
zum EndzielB
- Löschen
A
Ich habe bei Schritt 3 eine Race-Bedingung, bei der Mac OS X gelegentlich mit dem Fehler -47 zurückkehrt (fBsyErr
), wenn Sie versuchen, die Datei mit zu löschen FSDeleteObject
.Ich bin mir absolut sicher, dass ich der Einzige bin, der diese Datei ändert, und vermute, dass das Betriebssystem zu dem Zeitpunkt, zu dem ich versuche, die Datei zu löschen, etwas tut (z. B. Hintergrund-Caching-Aufgaben), was zu dem Fehler führt.
Dies ist ein zeitweise auftretendes Problem:normalerweise die FSDeleteObject
Anruf funktioniert einwandfrei.In den Fällen, in denen ich den Fehlercode zurückerhalte, möchte ich die Datei „zu einem späteren Zeitpunkt“ sicher löschen, wenn das Betriebssystem damit fertig ist.
Was wäre die beste Vorgehensweise, um diese problematische temporäre Datei zu löschen?
Lösung
Hier ist was passiert:
- Die häufigste Ursache für
FSDeleteObject
vorübergehend scheitern mitfBsyErr
liegt daran, dass Spotlight gerade dabei ist, die Datei zu indizieren.Wenn Sie eine Datei ändern, schließen Sie sie und versuchen Sie dann sofort, sie mit zu löschenFSDeleteObject
, ist es durchaus möglich, dass der Spotlight-Indexer es geöffnet hat und Sie erhaltenfBsyErr
.- Auch einige Antivirenscanner von Drittanbietern können dieses Problem auslösen.Wenn Sie eine geänderte Datei schließen, beginnt der Antivirenscanner sofort mit der Überprüfung auf Viren.Wenn beim Versuch, die Datei zu löschen, immer noch überprüft wird,
FSDeleteObject
wird scheitern mitfBsyErr
.
Für jedes Problem gibt es eine Reihe von Problemumgehungen. Am besten nutzen Sie beide unlink