在我的应用程序中使用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操作中遇到此错误吗?
另外,如果我真的想要如何故意关闭此文件描述符?这个问题的答案将帮助我更好地理解这个问题。
答案 0 :(得分:2)
(我不认为这是一个完整的答案,但我希望它会有所帮助,可以变成一个。)
您正在查看的错误EBADF
。它是通过关闭文件操作返回的。但是你已经想到了这一点。 :)
假设您没有使用stdio库,我认为您遇到的相当于过度发布。基本上,你将文件的所有权交给某个东西,然后关闭它。
您应该特别注意NSFileHandle
,尤其是要查看您或任何人是否正在调用initWithFileDescriptor:
,copy
文件等。这些可能导致{{1}取得文件描述符的所有权,这意味着在解除分配时关闭它。
少看你的网络代码,更多关注你如何设置文件。
答案 1 :(得分:1)
根据this Apple TechNote多任务和网络,如果应用程序被挂起并且回收套接字,则可以获得EBADF
(POSIX错误9)。
注意:当您的应用程序恢复执行时,a返回的实际错误 其资源被回收的套接字故意不是 在此指定以允许将来的改进。但是,在许多情况下 错误将是
EBADF
,这可能不是你的错 期待!在正常情况下,EBADF
表示该应用具有 将无效的文件描述符传递给系统调用。但是,在 已经回收资源的套接字的情况,并不意味着 文件描述符无效,只是套接字是否 更长的可用时间。