| Предыдущий | Следующий |
| EBUSY | EXDEV |
EEXIST
Почему это может быть нормальным результатом гонки
EEXIST означает, что API должен был создать объект только при отсутствии целевого имени, однако имя уже существует. Классический файловый пример — open() с одновременными флагами O_CREAT и O_EXCL; тот же принцип используют создание ссылок и современные варианты переименования без замены. Ошибка может быть ожидаемой, когда несколько обработчиков пытаются занять одно имя.
Нередко этот результат подтверждает, что программа правильно применила атомарную операцию «создать или отказать», а не отдельную проверку существования. Проверка «есть ли файл?» создаёт гонку: другой процесс может создать объект между проверкой и запросом на создание.
Как правильно обработать
- Заранее определите, означает ли уже существующий объект успех, конфликт или необходимость выбрать новое уникальное имя.
- Перед признанием объектов эквивалентными проверьте существующий объект: то же имя может принадлежать другому клиенту, заданию или версии.
- Сохраняйте атомарность создания. Не заменяйте
O_EXCLпоследовательностью «проверить, затем создать». - Для конкурирующих обработчиков сохраняйте идентификатор создателя и используйте явный протокол захвата или аренды, если одного имени недостаточно.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.