资源描述:
《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