Condição de corrida ao chamar fsdeleteObject
-
20-09-2019 - |
Pergunta
Eu implementei uma operação de "salvamento seguro" que vai algo assim:
- Salve alguns dados no arquivo temporário
A
- Copiar conteúdo de
A
para o destino finalB
- Excluir
A
Eu tenho uma condição de corrida na Etapa 3, onde o Mac OS X ocasionalmente voltará com o erro -47 (fBsyErr
) ao tentar excluir o arquivo usando FSDeleteObject
. Estou completamente confiante de que sou o único que modifica esse arquivo e suspeito que o sistema operacional está fazendo algo (por exemplo, tarefas de cache de fundo) no momento em que tento excluir o arquivo, resultando no erro.
Esta é uma questão intermitente: normalmente o FSDeleteObject
Chamada funciona muito bem. Nos casos em que eu recebo o código de erro de volta, gostaria de excluir com segurança o arquivo "em um momento posterior", quando o sistema operacional terminar de jogar com ele.
Qual seria o melhor curso de ação para tentar excluir esse arquivo temporário problemático?
Solução
Aqui está o que está acontecendo:
- A causa mais comum de
FSDeleteObject
falhando temporariamente comfBsyErr
é que os holofotes estão no processo de indexação do arquivo. Se você modificar um arquivo, feche -o e, em seguida, tente excluí -lo usando -o usandoFSDeleteObject
, é bem possível que o indexador do Spotlight seja aberto e você teráfBsyErr
.- Alguns scanners antivírus de terceiros também podem desencadear esse problema. Quando você fecha um arquivo modificado, o scanner antivírus começa imediatamente a verificar se há vírus. Se ainda estiver verificando quando você tenta excluir o arquivo,
FSDeleteObject
falhará comfBsyErr
.
Cada problema tem uma série de soluções alternativas, a melhor para ambos é usar unlink