Состояние гонки при вызове FSDeleteObject - PullRequest
0 голосов
/ 11 февраля 2010

Я реализовал операцию «безопасного сохранения», которая выглядит примерно так:

  1. Сохранить некоторые данные во временный файл A
  2. Копировать содержимое A в конечный пункт назначения B
  3. Удалить A

У меня есть условие гонки на шаге 3, когда Mac OS X иногда возвращается с ошибкой -47 (fBsyErr) при попытке удалить файл с помощью FSDeleteObject. Я полностью уверен, что я единственный, кто изменяет этот файл, и подозреваю, что ОС что-то делает (например, задачи фонового кэширования) во время попытки удалить файл, что приводит к ошибке.

Это периодически возникающая проблема: обычно вызов FSDeleteObject работает просто отлично. В тех случаях, когда я получаю код ошибки, я хотел бы безопасно удалить файл «в более поздний момент времени», когда ОС закончит играть с ним.

Как лучше всего попытаться удалить этот проблемный временный файл?

1 Ответ

0 голосов
/ 12 февраля 2010

Вот что происходит:

  1. Самая частая причина временного сбоя FSDeleteObject с fBsyErr заключается в том, что Spotlight находится в процессе индексации файла. Если вы измените файл, закроете его и сразу же попытаетесь удалить его с помощью FSDeleteObject, вполне возможно, что индексатор Spotlight откроет его, и вы получите fBsyErr.
  2. Некоторые сторонние антивирусные сканеры также могут вызывать эту проблему. Когда вы закрываете измененный файл, антивирусный сканер немедленно начинает проверять его на наличие вирусов. Если при попытке удаления файла все еще выполняется проверка, FSDeleteObject завершится с ошибкой fBsyErr.

В каждой задаче есть ряд обходных путей, лучше всего использовать unlink

...