linux内核中的文件描述符(三)--fd的回收

发布者:RadiantDusk最新更新时间:2016-03-02 来源: eefocus关键字:linux内核  文件描述符  回收 手机看文章 扫描二维码
随时随地手机看文章
Kernel version:2.6.14

CPU architecture:ARM920T

Author:ce123(http://blog.csdn.net/ce123)

1.close函数

 

上图说明了close(fd)的执行过程,主要包括两部分:释放文件描述符fd,关闭文件file。

 

[plain] view plain copy
 
 print?
  1. //fs/open.c  
  2. asmlinkage long sys_close(unsigned int fd)  
  3. {  
  4.     struct file * filp;  
  5.     struct files_struct *files = current->files;//获得当前进程的files结构  
  6.     struct fdtable *fdt;  
  7.   
  8.     spin_lock(&files->file_lock);  
  9.     fdt = files_fdtable(files);//通过进程的打开文件列表获得文件描述符位图结构  
  10.     if (fd >= fdt->max_fds)  
  11.         goto out_unlock;  
  12.     filp = fdt->fd[fd];  
  13.     if (!filp)  
  14.         goto out_unlock;  
  15.     rcu_assign_pointer(fdt->fd[fd], NULL);  
  16.     FD_CLR(fd, fdt->close_on_exec);  
  17.     __put_unused_fd(files, fd);//释放文件描述符  
  18.     spin_unlock(&files->file_lock);  
  19.     return filp_close(filp, files);//关闭文件  
  20.   
  21. out_unlock:  
  22.     spin_unlock(&files->file_lock);  
  23.     return -EBADF;  
  24. }  

2.释放文件描述符__put_unused_fd

 

 

[plain] view plain copy
 
 print?
  1. static inline void __put_unused_fd(struct files_struct *files, unsigned int fd)  
  2. {  
  3.     struct fdtable *fdt = files_fdtable(files);  
  4.     __FD_CLR(fd, fdt->open_fds);//清除位图中的相应标记  
  5.     if (fd < fdt->next_fd)  
  6.         fdt->next_fd = fd;//如果释放的fd小于next_fd,则next_fd = fd,下次分配从next_fd开始。  
  7.                     //因此释放一个fd后,再打开或创建一个文件放回的可能还是刚释放的fd  
  8. }  

3.关闭文件filp_close

 

 

[plain] view plain copy
 
 print?
  1. int filp_close(struct file *filp, fl_owner_t id)  
  2. {  
  3.     int retval = 0;  
  4.   
  5.     if (!file_count(filp)) {  
  6.         printk(KERN_ERR "VFS: Close: file count is 0\n");  
  7.         return 0;  
  8.     }  
  9.   
  10.     if (filp->f_op && filp->f_op->flush)  
  11.         retval = filp->f_op->flush(filp);  
  12.   
  13.     dnotify_flush(filp, id);  
  14.     locks_remove_posix(filp, id);  
  15.     fput(filp);  
  16.     return retval;  
  17. }  
filp_close函数调用fput,在fput中调用release函数。
[plain] view plain copy
 
 print?
  1. //fs/file_table.c  
  2. void fastcall fput(struct file *file)  
  3. {  
  4.     if (rcuref_dec_and_test(&file->f_count))  
  5.         __fput(file);  
  6. }  
  7.   
  8. void fastcall __fput(struct file *file)  
  9. {  
  10.     struct dentry *dentry = file->f_dentry;  
  11.     struct vfsmount *mnt = file->f_vfsmnt;  
  12.     struct inode *inode = dentry->d_inode;  
  13.   
  14.     might_sleep();  
  15.   
  16.     fsnotify_close(file);  
  17.     /*  
  18.      * The function eventpoll_release() should be the first called  
  19.      * in the file cleanup chain.  
  20.      */  
  21.     eventpoll_release(file);  
  22.     locks_remove_flock(file);  
  23.   
  24.     if (file->f_op && file->f_op->release)  
  25.         file->f_op->release(inode, file);//在这里调用release函数。在socket中即socket_close函数  
  26.     security_file_free(file);  
  27.     if (unlikely(inode->i_cdev != NULL))  
  28.         cdev_put(inode->i_cdev);  
  29.     fops_put(file->f_op);  
  30.     if (file->f_mode & FMODE_WRITE)  
  31.         put_write_access(inode);  
  32.     file_kill(file);  
  33.     file->f_dentry = NULL;  
  34.     file->f_vfsmnt = NULL;  
  35.     file_free(file);  
  36.     dput(dentry);  
  37.     mntput(mnt);  
  38. }  

关键字:linux内核  文件描述符  回收 引用地址:linux内核中的文件描述符(三)--fd的回收

上一篇:linux内核中的文件描述符(四)--fd的分配--get_unused_fd
下一篇:linux内核中的文件描述符(二)--socket和文件描述符

推荐阅读最新更新时间:2024-03-16 14:45

新能源汽车电池“报废潮”带来动力电池回收产业机遇期
我国第一批投入市场的 新能源汽车 动力电池 将很快迎来集中报废期。市场研究机构发布数据称,2016年我国动力电池的报废量约1.2万吨,到2020年这一数字预计将激增至约24.8万吨。废旧动力电池集中“退役”给回收产业带来了机遇窗口。   然而,要兑现这笔“收益”并非易事,不成熟的技术、不规范的处理、不到位的监管,都有可能侵蚀发展红利,建立一个成熟、高效的回收利用体系势在必行。   “报废潮”带来动力电池回收产业机遇期 深圳市交通运输委员会发布消息称,除保留部分非纯电动车作为应急运力外,全市专营公交车辆已全部实现纯电动化。到2020年,深圳还将实现出租车100%电动化。   这是我国迈向新能源汽车产销大国的一个缩影。自2014年以来
[嵌入式]
海南省将建立新能源车动力电池回收体系
  11月22日,海南省工信厅发布了《关于印发关于进一步做好新能源汽车动力蓄电池回收利用工作的指导意见的通知》(以下简称“通知”)提出,要基本实现对全省新能源汽车动力蓄电池的全生命周期监管,初步建立新能源汽车动力蓄电池回收利用体系。   通知还指出,要建立完备的动力蓄电池监管回收网络,确保废旧动力蓄电池安全有效地进入正规回收渠道;打造一批动力蓄电池梯次利用示范项目,探索建立动力蓄电池梯次利用交易平台,形成较为成熟的循环利用产业链发展模式,动力蓄电池使用、贮运、回收、拆解、利用等环节规范有序。   以下为通知原文: 海南省工业和信息化厅关于进一步做好新能源汽车动力蓄电池回收利用工作的指导意见   
[新能源]
arm驱动Linux内核开发之阻塞非阻塞IO轮询操作
《 Linux内核开发之阻塞非阻塞IO----轮询操作》涉及内核驱动函数二个,内核结构体零个,分析了内核驱动函数二个;可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动一个 一、概念:Poll是非阻塞IO----轮询操作 非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞. Tip:select()和poll(),epoll查询是否可对设备进行无阻塞的访问,这几个系统调用最终又会引发设备驱动中的poll()函数被执行 PS:看到这感觉晕了
[单片机]
SPV1050:意法半导体新超低功耗高能效能量回收及充电器
今天的物联网(IoT)是由数量庞大的安装在人类极难接近地方的远程传感单元组成,为保证业务不中断,降低检修成本,这些传感单元必须智能管理能源,完全自主运行。这些要求表明,能量回收及充电设计必须保证转换能效极高,充电管理适当,尽可能从环境提取更多的电能送到电池,以最快的速度贮存电能,而且不会损坏电池或缩短电池续航时间。 为满足这些技术需求,意法半导体推出了一款微型封装或裸片的超低功耗直流-直流转换器芯片,该芯片可用于太阳能光伏(PV)板或热电发生器(TEG),基于从能源提取电能优化技术的最大功率点追踪算法(MPPT),内置一个能效极高的电源管理模块,能够给任何类型的电池快速充电,或为微控制器、收发器、传感器等周边配套芯片提供电能;适用于
[电源管理]
SPV1050:意法半导体新超低功耗高能效能量<font color='red'>回收</font>及充电器
关于公布2021年安徽省新能源汽车动力蓄电池回收利用区域中心企业(站)试点名单的通知
皖经信节能函〔2021〕174号 各市经济和信息化、科技、生态环境、交通运输、商务、市场监督、能源主管部门:   根据《新能源汽车动力蓄电池回收利用管理暂行办法》《新能源汽车动力蓄电池梯次利用管理办法》《新能源汽车废旧动力蓄电池综合利用行业规范条件》《新能源汽车动力蓄电池回收服务网点建设和运营指南》(以下简称《指南》)等文件精神,为进一步深化新能源汽车动力蓄电池回收利用试点工作,加快构建回收利用体系,促进新能源汽车动力蓄电池产业高质量发展,助推新能源汽车产业健康发展,我省组织开展了新能源汽车动力蓄电池回收利用区域中心企业(站)培育工作,经企业申报、各市推荐、专家审核等程序,现公布试点企业名单并提出有关要求。   一、
[新能源]
伊顿亮相2015上海车展展示车载加油油气回收系统
    动力管理公司伊顿今天在第十六届上海国际汽车工业展览会(2015上海国际车展)上展示了创新的车载加油油气回收系统(ORVR)。这种车辆排放控制技术已在美国应用了近20年,它能够收集加油过程中挥发出来的燃油蒸汽,作为燃料进行再利用,从而减少车辆加油过程中约95%的碳氢化合物排放,占每年汽车碳氢化合物排放总量的50%。     行业数据显示,在车辆加油过程中,大量碳氢化合物通过加油口向大气排出,是雾霾的重要成因之一。中国政府已经开始起草针对ORVR要求的法规,以解决国内严峻的环境污染问题。据悉,ORVR相关法规将在2015年正式发布,并在2017年初开始实施,从北京、广州逐步推广至全国其他各大城市及地区。     伊
[汽车电子]
ARM在嵌入式linux内核裁剪与移植的应用
微处理器用一片或少数几片大规模集成电路组成的中央处理器。这些电路执行控制部件和算术逻辑部件的功能。微处理器与传统的中央处理器相比,具有体积小,重量轻和容易模块化等优点。微处理器的基本组成部分有:寄存器堆、运算器、时序控制电路,以及数据和地址总线。微处理器能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等操作,是微型计算机的运算控制部分。它可与存储器和外围电路芯片组成微型计算机。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的
[单片机]
如何建好动力电池回收网?部分新能源车电池回收存隐患
随着第一批新能源汽车动力电池进入规模化退役期,动力电池如何妥善回收再利用,成为社会关注的话题。有读者来信反映,部分退役动力电池未能进入规范回收企业,甚至不少流入小作坊,动力电池包含多种重金属元素,处理不当既不利于资源回收,还会造成安全隐患和环境污染。    “我们生产新能源汽车是为了环保,如果因为动力电池未能妥善回收造成污染,就背离了这个行业的初衷。”北京赛德美资源再利用研究院有限公司总经理赵小勇表示。    规范退役动力电池回收企业数量不多、成本较高,在回收环节处于竞争劣势    公安部发布的数据显示,新能源汽车连续3年年增长超过100万辆,今年上半年新注册登记新能源汽车达110.3万辆,同比增长234.92%。截至6月底
[汽车电子]
如何建好动力电池<font color='red'>回收</font>网?部分新能源车电池<font color='red'>回收</font>存隐患
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
    天是星期天,刚好在家里休息。又是学习ARM的大好时机了。早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的。搞得睡觉,也睡 ...
  • 学习ARM开发(4)
    已经把CPU大体架构学会了,当然我之前已经学习过80X86的结构,所以对于像RISC的计算机,也能想像到它是什么样的东西。如果没有学习过《微机 ...
  • 学习ARM开发(6)
  • 学习ARM开发(7)
  • 学习ARM开发(8)
  • 学习ARM开发(9)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved