Что означает код errno 17 (EEXIST)?

 
Также может означать:
КонстантаТипОС
ERROR_NOT_SAME_DEVICEОшибка WindowsWindows
KERN_INVALID_RIGHTКод возврата ядра macOSmacOS
ippStsUnderflowСтатус Intel IPPЛюбая
THREAD_NOT_MUTEX_OWNERКод BSODWindows
Предыдущий Следующий
EBUSY EXDEV

EEXIST

Почему это может быть нормальным результатом гонки

EEXIST означает, что API должен был создать объект только при отсутствии целевого имени, однако имя уже существует. Классический файловый пример — open() с одновременными флагами O_CREAT и O_EXCL; тот же принцип используют создание ссылок и современные варианты переименования без замены. Ошибка может быть ожидаемой, когда несколько обработчиков пытаются занять одно имя.

Нередко этот результат подтверждает, что программа правильно применила атомарную операцию «создать или отказать», а не отдельную проверку существования. Проверка «есть ли файл?» создаёт гонку: другой процесс может создать объект между проверкой и запросом на создание.

Как правильно обработать

  • Заранее определите, означает ли уже существующий объект успех, конфликт или необходимость выбрать новое уникальное имя.
  • Перед признанием объектов эквивалентными проверьте существующий объект: то же имя может принадлежать другому клиенту, заданию или версии.
  • Сохраняйте атомарность создания. Не заменяйте O_EXCL последовательностью «проверить, затем создать».
  • Для конкурирующих обработчиков сохраняйте идентификатор создателя и используйте явный протокол захвата или аренды, если одного имени недостаточно.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.