Linux内核中的文件描述符(三)——fd的回收

发表于:2013-1-15 09:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ce123    来源:51Testing软件测试网采编

  Kernel version:2.6.14

  CPU architecture:ARM920T

  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
}

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号