Linux VFS中close系统调用实现原理

Linux VFS中close系统调用实现原理

ID:40749622

大小:48.00 KB

页数:4页

时间:2019-08-07

Linux VFS中close系统调用实现原理_第1页
Linux VFS中close系统调用实现原理_第2页
Linux VFS中close系统调用实现原理_第3页
Linux VFS中close系统调用实现原理_第4页
资源描述:

《Linux VFS中close系统调用实现原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、LinuxVFS中close系统调用实现原理目录close系统调用在内核里面的入口函数为sys_close根据用户空间传入的文件描述符fd取出对应的structfile结构体清空进程的文件描述符fd所对应的标准位,如果要关闭的这个的文件描述符对应的fd小于下一次的文件描述符起点,则根系下一次本进程的文件描述符起点为fd释放structfile结构体所以,只有调用了sys_close系统调用,进程的所有文件列表中才会把这个文件删除WORD里面的目录复制过来似乎不能直接用。。还是放在这里当主线看吧..clos

2、e系统调用在内核里面的入口函数为sys_close[root@syslab~]#grepclose/usr/include/asm/unistd_64.h#define__NR_close3__SYSCALL(__NR_close,sys_close)SYSCALL_DEFINE1(close,unsignedint,fd){{//这里SYSCALL_DEFINE1close到sys_close的转换请参看前面的文章Linux编程中的API函数和系统调用的关系structfile*filp;structf

3、iles_struct*files=current->files;structfdtable*fdt;intretval;spin_lock(&files->file_lock);fdt=files_fdtable(files);if(fd>=fdt->max_fds)gotoout_unlock;filp=fdt->fd[fd];if(!filp)gotoout_unlock;rcu_assign_pointer(fdt->fd[fd],NULL);__clear_close_on_exec(fd,fd

4、t);__put_unused_fd(files,fd);spin_unlock(&files->file_lock);retval=filp_close(filp,files);…//省略次要}函数不长,流程主要如下根据用户空间传入的文件描述符fd取出对应的structfile结构体方便理解,我写成Structfilefilt=current->files_struct->fdtable->files[fd];(current是当前task_struct)清空进程的文件描述符fd所对应的标准位,如果要关

5、闭的这个的文件描述符对应的fd小于下一次的文件描述符起点,则根系下一次本进程的文件描述符起点为fd__clear_close_on_exec(fd,fdt);//执行__clear_bit(fd,fdt->close_on_exec);操作,即在close_on_exec中把fd位的设置为0__put_unused_fd(files,fd);//执行__clear_open_fd(fd,fdt);,进一步执行__clear_bit(fd,fdt->open_fds);,即在open_fds位图中把这个fd

6、位也设置为0;并且还会执行if(fdnext_fd)files->next_fd=fd;至此,进程关联的所有文件描述符中已经不存在这个文件描述符了(根据不存在structfile及其相关dentry,inode,vfsmount了)释放structfile结构体fput(filp);这个函数执行的和sys_read中释放structfile结构体一样的操。点击(此处)折叠或打开1.voidfput(structfile*file)2.{3.if(atomic_long_dec_and_te

7、st(&file->f_count)){4.structtask_struct*task=current;5.file_sb_list_del(file);6.if(unlikely(in_interrupt()

8、

9、task->flags&PF_KTHREAD)){7.unsignedlongflags;8.spin_lock_irqsave(&delayed_fput_lock,flags);9.list_add(&file->f_u.fu_list,&delayed_fput_list);10.sch

10、edule_work(&delayed_fput_work);11.spin_unlock_irqrestore(&delayed_fput_lock,flags);12.return;13.}14.init_task_work(&file->f_u.fu_rcuhead,____fput);15.task_work_add(task,&file->f_u.fu_rcuhead,true);16.}17.}但是sys_read

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。