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

Kernel version:2.6.14

CPU architecture:ARM920T

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

1.close函数

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

//fs/open.c
asmlinkage long sys_close(unsigned int fd)
{struct file * filp;struct files_struct *files = current->files;//获得当前进程的files结构struct fdtable *fdt;spin_lock(&files->file_lock);fdt = files_fdtable(files);//通过进程的打开文件列表获得文件描述符位图结构if (fd >= fdt->max_fds)goto out_unlock;filp = fdt->fd[fd];if (!filp)goto out_unlock;rcu_assign_pointer(fdt->fd[fd], NULL);FD_CLR(fd, fdt->close_on_exec);__put_unused_fd(files, fd);//释放文件描述符spin_unlock(&files->file_lock);return filp_close(filp, files);//关闭文件out_unlock:spin_unlock(&files->file_lock);return -EBADF;
}

2.释放文件描述符__put_unused_fd

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

3.关闭文件filp_close

int filp_close(struct file *filp, fl_owner_t id)
{int retval = 0;if (!file_count(filp)) {printk(KERN_ERR "VFS: Close: file count is 0\n");return 0;}if (filp->f_op && filp->f_op->flush)retval = filp->f_op->flush(filp);dnotify_flush(filp, id);locks_remove_posix(filp, id);fput(filp);return retval;
}

filp_close函数调用fput,在fput中调用release函数。

//fs/file_table.c
void fastcall fput(struct file *file)
{if (rcuref_dec_and_test(&file->f_count))__fput(file);
}void fastcall __fput(struct file *file)
{struct dentry *dentry = file->f_dentry;struct vfsmount *mnt = file->f_vfsmnt;struct inode *inode = dentry->d_inode;might_sleep();fsnotify_close(file);/** The function eventpoll_release() should be the first called* in the file cleanup chain.*/eventpoll_release(file);locks_remove_flock(file);if (file->f_op && file->f_op->release)file->f_op->release(inode, file);//在这里调用release函数。在socket中即socket_close函数security_file_free(file);if (unlikely(inode->i_cdev != NULL))cdev_put(inode->i_cdev);fops_put(file->f_op);if (file->f_mode & FMODE_WRITE)put_write_access(inode);file_kill(file);file->f_dentry = NULL;file->f_vfsmnt = NULL;file_free(file);dput(dentry);mntput(mnt);
}

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

  1. linux内核中的文件描述符(四)--fd的分配--get_unused_fd

    linux内核中的文件描述符(四)--fd的分配--get_unused_fd Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123( ...

  2. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  3. linux内核中的文件描述符(一)--基础知识简介

    linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.cs ...

  4. 简述linux内核中,Linux内核中的文件描述符(一)——基础知识简介

    2.文件描述符 下面进一步介绍进程对自己所访问的file对象的管理方法.linux中使用一个数组来管理进程打开的文件的file对象,数组中的每个元素都存放一个纸箱进程所打开的文件的file对象.既然用 ...

  5. linux 内核 遍历文件夹,Linux内核中通过文件描述符获取绝对路径

    背景 在Linux内核中,已知一个进程的pid和其打开文件的文件描述符fd,如何获取该文件的绝对路径?基本思路是先获取该文件在内核中的file结构体,再通过d_path()获取到整个文件的绝对路径. ...

  6. linux c中的文件描述符与打开文件之间的关系

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通 ...

  7. 理解Unix/Linux系统中的文件描述符

    简介 文件描述符是针对Unix/Linux的每个进程而言的,每个进程都维护了一个文件指针表,指针指向操作系统的文件.这里的文件是指的Unix/Linux系统所说的文件,Unix/Linux下一切皆文件 ...

  8. Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定 ...

  9. Linux中的文件描述符与打开文件之间的关系

    1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是 ...

最新文章

  1. 【linux】SELinux工具:semanage的安装和使用
  2. 将 Firefox 浏览器的书签导出
  3. c 获得java数据_JNI:如何将一组数据从c转换为Java
  4. 剑指offer 重建二叉树
  5. SQL 给字符串补0
  6. ftp网页版服务器地址,免费ftp服务器地址汇总
  7. ubuntu 16.04安装VMwareTools
  8. 指令include和动作include的区别
  9. python正则表达式 身份证_python3中6种常用正则表达式
  10. MAC下的环境变量配置
  11. 今天拿到一个TFS Workgroup Edition,想从B3R升级,结果开始了一天的艰难之路。。...
  12. birt字体 linux,linux下birt 图表中文乱码问题
  13. 【智能车】模糊PID控制原理详解与代码实现
  14. 2015年河南省省赛部分题题解
  15. init cloudchannel failerr:10102 - message:参数无效
  16. 组件化-创建私有组件库库
  17. 中南大学复试上机: 彩色气球
  18. cad审图软件lisp_CAD审图标记下载_CAD审图标记官方下载_CAD审图标记v4-华军软件园...
  19. 基于 Bitwarden 搭建密码管理器(群晖 Docker)
  20. JavaScript (11) ES6语法

热门文章

  1. 高一计算机课期中考试总结反思,2017高一数学期中考试反思总结
  2. 录音文件下载_录音转文字app有哪些?录音转文字助手怎么样?
  3. chrome浏览器使用js导出Excel出现网络错误
  4. 二进制转十进制 八进制 十六进制
  5. 罗翔文老师——实战派内部控制与内部审计专家,上海财经大学兼职教授
  6. 任志强2018首谈房价:买房去北京新机场 千万别去崇礼
  7. 第1章 开始使用C++
  8. 推荐系统 - 基于FM算法的协同召回算法
  9. teamviewer 使用数量到达上限_Teamviewer免费版到达设备上限号就废了?
  10. 神经网络之反向传播算法(均方根反向传播算法RMSProp)