关键词: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. SpringBoot整合jdbcTemplate

    一.目录展示 二.导入依赖 三.配置文件 四.Student实体类 package com.zn.entity; public class Student { private Integer stu_ ...

  2. ES6 学习之 let

    关于闭包: <html> <body> <div> <div> <button >aaa</button> <button ...

  3. IT兄弟连 HTML5教程 CSS3属性特效 渐变3

    4  径向渐变 CSS3径向渐变是圆形或椭圆形渐变.颜色不再沿着一条直线轴变化,而是从一个起点朝所有方向混合.但相对线性渐变要比径向渐变复杂的多. 径向渐变的格式如下: radial-gradient ...

  4. Python基础语法-List

    列表的操作方法 列表中存放的数据是可以进行修改的,比如"增"."删"."改"" 添加元素("增" append ...

  5. SLES 12: Database Startup Error with ORA-27300 ORA-27301 ORA-27303 While Starting using Srvctl (Doc ID 2340986.1)

    SLES 12: Database Startup Error with ORA-27300 ORA-27301 ORA-27303 While Starting using Srvctl (Doc ...

  6. 【机器学习基础】交叉熵(cross entropy)损失函数是凸函数吗?

    之所以会有这个问题,是因为在学习 logistic regression 时,<统计机器学习>一书说它的负对数似然函数是凸函数,而 logistic regression 的负对数似然函数 ...

  7. android 启动流程 相关2 init进程 属性服务

    Init属性服务 系统属性服务 属性梳理 来源和读取时机 来源:内核参数 ro.kernel.*   代表有qemu内核参数才会设置(在虚拟机中) ro.boot.*     1.内核设备树相关的设备 ...

  8. RabbitMQ学习笔记(八、RabbitMQ总结)

    1.什么是消息中间件 Message Queue Middleware,简称MQ,是一种利用高效可靠的消息传递机制进行与平台无关的数据交互的技术. 2.MQ的作用 异步:类似于短信业务,将需要发送的消 ...

  9. python的@propert装饰器

    首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问.propert可以有两种用法:可以把一个方法变成只读属性:可以对一些属性进行过滤. 想象这样一个场景,在实例化一个类之后,需 ...

  10. Django中获取参数(路径,查询,请求头,请求体)

    一.通常HTTP协议向服务器传参有几种途径 : 提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取: 查询字符串(query string), ...