记录一个问题的解决流程
起因是这样的,在真机上会莫名其妙的加载某些文件出现失败的情况,并且这些文件都是底包内的文件,理论上是不会出现损坏的情况
第一步,追查fopen
打开错误时相关的错误码信息
#include <errno.h>
FILE *fp = fopen(fullPath, "rb");
if (!fp)
return errno;
引入头文件errno.h
,在fopen打开失败后,返回记录的错误码errno
,对应错误码的参考信息参照下面文章,
博主获取到错误码信息是24
,对应的解释是当前打开的文件太多了,文件描述符不够用了
第二步,追查没有关闭的文件信息
现在问题就是可能某些文件通过fopen
打开后,并没有调用fclose
造成文件描述符全部被占用了,再打开新的文件就失败了,所以现在的首要目标就是获取打开文件信息
博主在stackoverflow上看到了可用的解决方案,具体代码参考一下
#import <sys/types.h>
#import <fcntl.h>
#import <errno.h>
#import <sys/param.h>
+(void) lsof
{
int flags;
int fd;
char buf[MAXPATHLEN+1] ;
int n = 1 ;
for (fd = 0; fd < (int) FD_SETSIZE; fd++) {
errno = 0;
flags = fcntl(fd, F_GETFD, 0);
if (flags == -1 && errno) {
if (errno != EBADF) {
return ;
}
else
continue;
}
fcntl(fd , F_GETPATH, buf ) ;
NSLog( @"File Descriptor %d number %d in use for: %s",fd,n , buf ) ;
++n ;
}
}
在上述代码中可以通过函数fcntl
获取到对应index的文件描述符所对的占用文件信息
参考地址:on iOS/iPhone: “Too many open files”: need to list open files (like lsof)
如果碰到类似的问题可以参考一下