Condición de carrera al llamar FSDeleteObject
-
20-09-2019 - |
Pregunta
He implementado una operación "segura salvar" que dice algo como esto:
- Save algunos datos a
A
archivo temporal - Copiar el contenido de
A
aB
destino final - Eliminar
A
Tengo una condición de carrera en el paso 3 en Mac OS X de vez en cuando volver con el error -47 (fBsyErr
) al intentar eliminar el archivo con FSDeleteObject
. Estoy completamente seguro de que soy el único que modificar este archivo y sospecho que el sistema operativo está haciendo algo (por ejemplo, las tareas de fondo de caché) en el momento trato de borrar el archivo, lo que resulta en el error.
Este es un problema intermitente: normalmente la llamada FSDeleteObject
funciona bien. En aquellos casos en que recibo el código de error de vuelta Me gustaría eliminar el fichero "en un momento posterior en el tiempo" cuando el sistema operativo ha terminado de jugar con él.
¿Cuál sería el mejor curso de acción a tomar para tratar de eliminar este archivo temporal problemático?
Solución
Aquí es lo que está sucediendo:
- La causa más común de
FSDeleteObject
fallar temporalmente confBsyErr
es que Spotlight está en el proceso de indexación del archivo. Si modifica un archivo, cerrarlo, y luego tratar de inmediato para eliminarlo usandoFSDeleteObject
, es muy posible que el indexador de Spotlight que se abra y obtendráfBsyErr
.- Algunos programas antivirus de terceros también pueden desencadenar este problema. Al cerrar un archivo modificado, el escáner antivirus se inicia de inmediato para comprobar en busca de virus. Si todavía está comprobando cuando intenta eliminar el archivo,
FSDeleteObject
fallará confBsyErr
.
Cada problema tiene una serie de soluciones, el mejor para los dos es el uso de unlink