在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)


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值