race condition quando si chiama FSDeleteObject
-
20-09-2019 - |
Domanda
Ho implementato un'operazione di "risparmi sicuro" che va qualcosa come questo:
- Salva alcuni dati a
A
file temporaneo - Copia contenuto di
A
aB
destinazione finale - Elimina
A
Ho una condizione di competizione al punto 3 in cui Mac OS X a volte tornare indietro con l'errore -47 (fBsyErr
) quando si tenta di eliminare il file utilizzando FSDeleteObject
. Sono completamente sicuro io sono l'unico modifica di questo file e il sospetto che il sistema operativo sta facendo qualcosa (ad esempio, le operazioni in background caching) al momento cerco di eliminare il file, con conseguente errore.
Questo è un problema intermittente: normalmente la chiamata FSDeleteObject
funziona bene. Nei casi in cui ottengo il codice di errore di nuovo mi piacerebbe eliminare in modo sicuro il file "in un secondo momento", quando il sistema operativo è finito di giocare con esso.
Quale sarebbe la migliore linea di azione da intraprendere per cercare di eliminare questo file temporaneo fastidioso?
Soluzione
Ecco quello che sta accadendo:
- La causa più comune di
FSDeleteObject
non aver temporaneamente confBsyErr
è che Spotlight è nel processo di indicizzazione del file. Se si modifica un file, chiuderlo e quindi provare subito per cancellarlo usandoFSDeleteObject
, è molto probabile che l'indicizzatore Spotlight avrà aperto e si otterràfBsyErr
.- Alcuni scanner anti-virus di terze parti possono anche innescare questo problema. Quando si chiude un file modificato, lo scanner anti-virus inizia immediatamente a controllare la presenza di virus. Se ancora il controllo quando si tenta di eliminare il file,
FSDeleteObject
fallirà confBsyErr
.
Ogni problema ha una serie di soluzioni alternative, il meglio per entrambi è quello di utilizzare unlink