| Предыдущий | Следующий |
| EADDRNOTAVAIL | ENOPROTOOPT |
ENOSTR
На этой странице рассматривается состояние Дескриптор Darwin не является потоком STREAM. Операция или ioctl, предназначенные для STREAMS, были применены к дескриптору, который не представляет поток STREAM.
Исторический контекст и контекст API
Обработка системных вызовов Darwin BSD: состояние «дескриптор Darwin не является потоком STREAM» относится к Darwin errno и должно декодироваться по точному заголовку SDK или XNU, использованному целевой системой. Расширения Darwin и устаревшие имена STREAMS, связанные с этим состоянием, могут отличаться наличием или нумерацией в других UNIX-подобных системах при диагностике дескриптора, не являющегося потоком STREAM. В рамках Обработки системных вызовов Darwin BSD формулировка, связанная с ENOSTR, указывает на исходный интерфейс, но не доказывает, что код вернула современная подсистема с похожим названием.
Darwin назначает нескольким символам errno вне POSIX собственные значения и номера при диагностике дескриптора, не являющегося потоком STREAM. При исследовании дескриптора, не являющегося потоком STREAM, не декодируйте число по таблице Linux и не считайте, что тот же символ возвращается тем же API в другой ОС.
Восстановите отказавший вызов
| Сведения | На какой вопрос отвечают |
|---|---|
| Происхождение дескриптора, тип по fstat, путь открытия, операция и ожидаемый модуль. | Связывают ошибку с конкретным действующим объектом API, а не только с переведённым сообщением при диагностике дескриптора, не являющегося потоком STREAM. |
| Значение Darwin errno и версия заголовка SDK/XNU, по которому оно декодировано при диагностике дескриптора, не являющегося потоком STREAM. | Показывают, возникла ли ошибка в ABI вызывающей стороны, оболочке или поставщике при диагностике дескриптора, не являющегося потоком STREAM. |
| Результат первого системного вызова или ioctl, а также процесс, поток и поколение объекта при диагностике дескриптора, не являющегося потоком STREAM. | Сохраняют первую границу до того, как errno может быть перезаписан при диагностике дескриптора, не являющегося потоком STREAM. |
| Заведомо исправный объект того же класса в той же сборке macOS при диагностике дескриптора, не являющегося потоком STREAM. | Даёт контрольное сравнение на той же платформе. |
Сохраните errno сразу после отказавшего вызова, вернувшего состояние Дескриптор Darwin не является потоком STREAM, до выполнения форматирования, трассировки, выделения памяти или очистки. Для Дескриптор Darwin не является потоком STREAM также сохраните возвращаемое значение функции, поскольку многие интерфейсы C сообщают об ошибке через него, а errno используют лишь как дополнительную информацию.
Минимальное воспроизведение
- Откройте предполагаемую конечную точку STREAM и повторите минимальный ioctl. При проверке типа STREAM не меняйте двоичный файл, ABI заголовков и поставщика.
- Немедленно сохраните errno и сравните связанное возвращаемое значение при диагностике дескриптора, не являющегося потоком STREAM. Зафиксируйте, доходит ли проверка дескриптора до той же границы системного вызова или среды выполнения, что и исходная ошибка.
- Повторите тест с одним контролируемым объектом, сохранив идентификатор и песочницу без изменений при диагностике дескриптора, не являющегося потоком STREAM. Изменение errno после теста указывает на новую границу, а не на другую формулировку той же ошибки.
Особенно показательны происхождение дескриптора, тип по fstat, путь открытия, операция и ожидаемый модуль. В качестве контроля откройте предполагаемую конечную точку STREAM и повторите минимальный ioctl. Для состояния Дескриптор Darwin не является потоком STREAM эти данные позволяют отличить устаревший идентификатор или неподдерживаемый запрос от общего отказа поставщика без масштабных изменений узла.
Ловушки переносимости
| Соблазнительное предположение | Более безопасная интерпретация |
|---|---|
| Английская фраза считается переносимой между платформами | Ошибка относится к обработке системных вызовов Darwin BSD; до применения таблицы errno другой платформы проверьте заголовки целевой системы и API, вернувший код |
| Повтор завершился успешно и стёр исходные данные | Повтор может заменить ошибку другим состоянием; заранее сохраните первый вызов, числовое значение и поколение объекта |
Если оболочка преобразует состояние Дескриптор Darwin не является потоком STREAM в исключение или логическое значение, добавьте инструментирование ниже этой оболочки. Для Дескриптор Darwin не является потоком STREAM решающее значение имеет системный вызов, ioctl, функция CRT или точка входа совместимости, впервые предоставившая код.
Исправление и критерии приёмки
Целевое исправление. Проверяйте тип дескриптора и направляйте обычные файлы и сокеты в предназначенные для них API.
Доказательство отсутствия регрессии. Приложение локально отклоняет неправильные классы дескрипторов, а предполагаемая операция с потоком завершается успешно. Проверьте один поддерживаемый граничный случай и один намеренно отрицательный случай, чтобы обработка состояния Дескриптор Darwin не является потоком STREAM оставалась явной.
Технические ссылки
Эти источники владельцев и стандартов определяют пространство имён и контракт подсистемы, необходимые для проверки Обработки системных вызовов Darwin BSD ENOSTR в установленной версии платформы.
- Apple XNU: errno.h — определяет используемое пространство статусов при диагностике дескриптора, не являющегося потоком STREAM.
- Apple: ошибки системных вызовов intro(2) — описывает границу API или жизненного цикла при диагностике дескриптора, не являющегося потоком STREAM.
- Apple OSS: исходный код XNU — предоставляет контекст ABI, реализации или протокола при диагностике дескриптора, не являющегося потоком STREAM.
- The Open Group: errno.h — определяет ограничения переносимости и проверки при диагностике дескриптора, не являющегося потоком STREAM.
Нужно найти другой код? Найти другой код состояния или ошибки.