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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

 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.casmlinkage 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.cvoid 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);}

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值