| Предыдущий | Следующий |
| ENOEXEC | ECHILD |
EBADF
Почему дескриптор становится недействительным
EBADF обычно означает, что номер файлового дескриптора уже не открыт, никогда не был корректно инициализирован, был закрыт по другой ветви управления либо открыт в режиме, не подходящем для вызова. Например, дескриптор, открытый только для записи, нельзя использовать для чтения. API, принимающие дескриптор каталога, также могут вернуть EBADF, если относительный путь сопоставлен с неверным dirfd.
В асинхронной и многопоточной программе это часто ошибка времени жизни: один поток закрывает или переиспользует дескриптор, пока другой всё ещё считает себя его владельцем. Повторное использование особенно опасно, потому что то же целое число позже может обозначать уже другой ресурс.
Как расследовать
- Протоколируйте получение, дублирование, передачу и закрытие дескриптора вместе с владельцем и потоком.
- Уточните, требует ли API дескриптор для чтения, записи, позиционирования, каталога, сокета или устройства, а не просто любой открытый дескриптор.
- Назначьте единственного владельца операции закрытия либо применяйте явную синхронизацию и подсчёт ссылок при передаче владения.
- Не повторяйте вызов с тем же номером, пока не подтверждены владелец и фактическая идентичность ресурса.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.