关键词:errno、EMFILE、ulimit、lsof等等。

背景是在对程序进行压力测试,运行了一段时间之后出现一个复位操作失败。

这个复位操作通过打开一个设备,进行读写操作,已达到控制GPIO输入输出的目的。

1. 初步分析原因

经过初步分析发觉fopen()返回NULL指针,说明fopen()错误了。

但是要想知道错误原因,还需要借助errno。通过errno为24,即可知道出错的原因为EMFILE。

由errno-base.h可知,EMFILE是打开文件过多的意思。

#define    EMFILE        24    /* Too many open files */

2. 找到是谁打开了哪个文件而没有释放

首先明白系统对资源使用限制的,通过ulimit可以查看限制或者修改限制。

关于文件打开文件数目的限制通过ulimit -n查看,或者ulimit -n <file null>修改限制。

通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024。

ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb)
-c: core file size (blocks)
-m: resident set size (kb) unlimited
-l: locked memory (kb)
-p: processes
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheduling priority
-r: real-time priority

lsof显示系统所有打开文件,那么很简单通过lsof即可查看到相关信息。

通过lsof可以看到打开的文件非常多,而且主要集中在uImage这个文件。

...
/heop/package/AiApp/AiApp /heop/package/AiApp/uImage
/heop/package/AiApp/AiApp /heop/package/AiApp/uImage
/heop/package/AiApp/AiApp /heop/package/AiApp/uImage
...

然后看到uImage这个文件被打开了1000多次,问题就很明了了。

通过走查代码,发现uImage文件在被打开后由于某些条件未fclose()。解决也比较简单。

3. EMFILE出现代码走查

open系统调用入口是do_sys_open(),通过get_unused_fd_flags()来获得可用的句柄号。

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
...
fd = get_unused_fd_flags(flags);
if (fd >= ) {
...
}
putname(tmp);
return fd;
} SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE; return do_sys_open(AT_FDCWD, filename, flags, mode);
}

然后就看看句柄是如何分配的,以及有什么限制。

通过rlimit(RLIMIT_NOFILE)可以获得系统对打开文件数目的限制,等同于ulimit -n。

然后__alloc_fd()应该着这个范围之内。当判断fd>=end的时候,返回-EMFILE

int get_unused_fd_flags(unsigned flags)
{
return __alloc_fd(current->files, , rlimit(RLIMIT_NOFILE), flags);
} int __alloc_fd(struct files_struct *files,
unsigned start, unsigned end, unsigned flags)
{
...
error = -EMFILE;
if (fd >= end)
goto out;
... out:
spin_unlock(&files->file_lock);
return error;
}

一个EMFILE问题定位:lsof、ulimit的应用,以及简单分析的更多相关文章

  1. Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

    加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链 ...

  2. [转] 一个U盘病毒简单分析

    (转自:一个U盘病毒简单分析 - 瑞星网   原文日期:2014.03.25) U盘这个移动存储设备由于体积小.容量大.便于携带等优点,给人们的存储数据带来了很大的便利.但正是由于这种便利,也给病毒有 ...

  3. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  4. 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频.

  5. 每天一个linux命令(38)--lsof 之FD文件描述符

    一般lsof 会输出以下这些信息: COMMAND: 进程的名称 PID:进程标识符 PPID:父进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:文件描述符,应用程序 ...

  6. 每天一个linux命令(38)--lsof命令

    lsof (list open files )是一个列出当前系统打开文件的工具,在Linux 环境下,任何事情都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  7. 多个ul中第一个li获取定位

    如果我们只是获取一个ul中的第一个li的话,那么我们可以这样写: $("ul li:first"); $("ul li").eq(0); $("ul ...

  8. 一个ActionResult中定位到两个视图—<团委项目>

         在使用MVC做项目的时候一般的情况就是一个ActionResult一个视图,这样对应的Return View();就可以找到下面对应的视图,这是根据一个原则,"约定大于配置&quo ...

  9. 谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

随机推荐

  1. Jmeter工具使用初体验

    一.Jmeter组成部分 一个完整的脚本必须包含以下三项,他们都在测试计划的子选项中,我们直接在测试计划上右键选择即可 线程组 取样器 监视器 二.脚本编写 1.创建线程组 2.添加取样器 我们这里添 ...

  2. Centos 下安装 PHP (新)

    今天重新实践了下 CentOS 7.6 下安装 PHP7 并完成配置,总结了一条可以照其实现的套路. 安装 PHP 所需扩展 # yum install libxml2 libxml2-devel o ...

  3. Effect:Mobile ocd

    Satisfy the following two Keep your phone at all times Check your phone even if there's no news Alwa ...

  4. cesium 雷达扫描(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  5. Android几种多渠道打包

    1.什么是多渠道打包 在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包.在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的 ...

  6. make和new关键字的区别及实现原

    new 和 make 是两个内置函数,主要用来创建并分配类型的内存.在我们定义变量的时候,可能会觉得有点迷惑,不知道应该使用哪个函数来声明变量,其实他们的规则很简单, new 只分配内存, make ...

  7. 算法之冒泡排序手写之js写法andjava写法

    对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了? 本系列文章帮助你解决这个问题. 其实排序算法,仔细品读他的名字就见名知意了. 比如冒泡排序就很形象,遍历n次,每次循环相邻元素两 ...

  8. SQL索引碎片的产生,处理过程。

    本文参考 https://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html https://www.jb51.net/softjc/12 ...

  9. 粗糙集理论(Rough Set Theory)

    粗糙集理论(Rough Set Theory) 一种数据分析处理理论. <粗糙集—关于数据推理的理论>. 数据挖掘(Data Mining)和知识发现(KDD). 集合近似定义的基本思想及 ...

  10. PHP 将远程文件写入到pdf或者word

    /** * 下载 */public function download($ids = null){ //一些条件参数啥的 $data = []; //获取文件 $res = curl_post(url ...