AFNetworking/NSURLConnection, получающий NSPOSIXErrorDomain Code = 9 "Операция не может быть завершена Плохой дескриптор файла" - программирование
Подтвердить что ты не робот

AFNetworking/NSURLConnection, получающий NSPOSIXErrorDomain Code = 9 "Операция не может быть завершена Плохой дескриптор файла"

В моем приложении, которое использует AFNetworking/NSURLConnection для отправки запросов на сервер, я иногда (очень редко) вижу эту ошибку в блоке сбоя операции:

Error Domain=NSPOSIXErrorDomain Code=9 "The operation couldn’t be completed. Bad file descriptor"

В https://devforums.apple.com/message/278770#278770 есть ответ на аналогичный вопрос:

Это означает, что кто-то освобождает дескрипторы файлов из-под NSURLConnection.

Но в моем собственном коде я никак не касаюсь потоков дескрипторов файлов. Это просто простые запросы GET/POST.

Что может быть причиной этой проблемы?

Кто-нибудь столкнулся с этой ошибкой в ​​своих операциях AFNetworking?

Также, как я могу закрыть этот дескриптор файла намеренно, если я действительно хотел? Ответ на этот вопрос поможет мне лучше понять проблему.

4b9b3361

Ответ 1

В соответствии с этот Apple TechNote по многозадачности и сети вы можете получить EBADF (POSIX error 9), если приложение приостановлено, а сокет исправлен.

Примечание. Когда ваше приложение возобновляет выполнение, фактическая ошибка, возвращаемая сокет, ресурсы которого были исправлены, намеренно не указанных здесь, чтобы обеспечить будущие уточнения. Однако во многих случаях ошибка будет EBADF, что, вероятно, не так, как вы ожидая! В нормальных условиях EBADF означает, что приложение имеет передал недействительный дескриптор файла на системный вызов. Однако в случай сокета, ресурсы которого были исправлены, это не означает что дескриптор файла был недействительным, только что сокет не более длительный срок годности.

Ответ 2

(Я не думаю, что это полный ответ, но я надеюсь, что он будет полезен и может быть превращен в один.)

Ошибка, которую вы смотрите на нее EBADF. Он вернулся из работы с закрытым файлом. Но вы уже поняли это.:)

Предполагая, что вы не используете библиотеку stdio, я думаю, что то, что вы используете, эквивалентно переопределению. В принципе, вы передаете права собственности на файл на что-то, что затем закрывает его.

Вы должны уделять особое внимание NSFileHandle, особенно если вы или кто-либо звоните initWithFileDescriptor:, copy в файл и т.д. Это может привести к тому, что NSFileHandle получит право собственности на файловый дескриптор, что означает его закрытие при освобождении.

Посмотрите меньше на свой сетевой код и больше на то, как вы настраиваете файлы.