在iphone上使用fopen打开文件失败,错误码24:EMFILE

记录一个问题的解决流程

起因是这样的,在真机上会莫名其妙的加载某些文件出现失败的情况,并且这些文件都是底包内的文件,理论上是不会出现损坏的情况


第一步,追查fopen打开错误时相关的错误码信息

#include <errno.h>

FILE *fp = fopen(fullPath, "rb");
if (!fp)
	return errno;

引入头文件errno.h,在fopen打开失败后,返回记录的错误码errno,对应错误码的参考信息参照下面文章,

C++ 文件操作返回值错误码列表及解析

博主获取到错误码信息是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)


如果碰到类似的问题可以参考一下

猜你喜欢

转载自blog.csdn.net/Mr_Sun88/article/details/132761389