资源描述:
《linux文件系统之文件的读写》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux文件系统之文件的读写(续二)------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------八:VFS层的I/O操作VFS层是与用户界面直接交互的接口,在这一节里,我们将分为读写两部份来介绍VFS层的操作以及跟上层用用的交互.8.1:文件的读操作在用户空间,读文件操作的常用函数为read()。对应在系统
2、空间的调用入口是sys_read().它的代码如下:asmlinkagessize_tsys_read(unsignedintfd,char__user*buf,size_tcount){ structfile*file; ssize_tret=-EBADF; intfput_needed; //根据fd从进程中取出相应的file对象 file=fget_light(fd,&fput_needed); if(file){ loff_tpos=file_po
3、s_read(file); //文件的当前位置 ret=vfs_read(file,buf,count,&pos); //更新当前的文件位置 file_pos_write(file,pos); fput_light(file,fput_needed); } returnret;}从进程中取得文件描述符后和文件当前的操作位置后会调用vfs_read()执行具体的操作过程.它的代码如下:ssize_tvfs_read(struc
4、tfile*file,char__user*buf,size_tcount,loff_t*pos){ structinode*inode=file->f_dentry->d_inode; ssize_tret; if(!(file->f_mode&FMODE_READ)) return-EBADF; if(!file->f_op
5、
6、(!file->f_op->read&&!file->f_op->aio_read)) return-EINVAL;//检查
7、当前区段是否允许读操作 ret=locks_verify_area(FLOCK_VERIFY_READ,inode,file,*pos,count); if(!ret){ //是否有权限 ret=security_file_permission(file,MAY_READ); if(!ret){ //如果有read操作,调用之 if(file->f_op->read) ret
8、=file->f_op->read(file,buf,count,pos); else //否则调用aio_read ret=do_sync_read(file,buf,count,pos); //ret:写入的字节数 if(ret>0) //产生通告 dnotify_parent(file->f_de
9、ntry,DN_ACCESS); } } returnret;}从上面看到,会最终调用file的相关操作完成文件的读操作.曾记得我们在文件的打开一节中分析了文件的打开过程。在打开文件过程中,文件描述符的相关操作会被赋值为inode->f_op.对于ext2文件系统,inode的相关信息如下: inode->i_fop=&ext2_file_operations;structfile_operationsext2_file_operations={ .llsee
10、k =generic_file_llseek, .read =generic_file_read, .write =generic_file_write, .aio_read=generic_file_aio_read, .aio_write =generic_file_aio_write, .ioctl =ext2_ioctl,