资源描述:
《linux内核空间的IO操作》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、探索Linux内核空间文件IO实现(下)内核空间文件操作函数注释内核空间读写文件的常规操作步骤同用户空间一样第一步:打开文件,获取文件指针第二步:将文件读入到一段内存中第三步:将一段内存中的数据写入到另一个文件中。完成上述功能要用的内核函数有:◆打开文件filp_open()◆关闭文件filp_close()◆读文件内容到内存中vfs_read()◆写内存中的数据到文件vfs_write()函数filp_open(constchar*filename,intopen_mode,intmode)函数功能:在
2、内核空间中打开文件函数原形:strcutfile*filp_open(constchar*filename,intopen_mode,intmode);返回值:strcutfile*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。参数:filename:表明要打开或创建文件的名称(包括路径部分)。open_mode:文件的打开方式,O_RDONLY只读打开、O_WRONLY只写打开、O_RDWR读写打开、O_CREAT文件不存在则创建。mode:创建文件时使用,设置创建文件的权限,
3、其它情况可以匆略设为0示例structfile*file=NULL;file=filp_open(/root/test.txt,O_RDWR
4、O_CREAT,0);//以读写方式(没有则创建)打开文件/root/test.txt。并返回test.txt的文件指针给file.函数filp_close(structfile*filp,fl_owner_tid)函数功能:关闭之前打开文件函数原型:intfilp_close(structfile*filp,fl_owner_tid);参数:structfile*
5、filp:打开文件的文件指针fl_owner_tid:一般传递NULL值,也可用current->files作为实参。示例filp_close(file,NULL);//关闭指针为file的文件。函数vfs_read(structfile*file,char__user*buf,size_tcount,loff_t*pos)函数功能:读取已经打开的文件到内存中函数原型:ssize_tvfs_read(structfile*file,char__user*buf,size_tcount,loff_t*pos
6、){ssize_tret;if(!(file->f_mode&FMODE_READ))//判断文件是否可读return-EBADF;if(!file->f_op
7、
8、(!file->f_op->read&&!file->f_op->aio_read))//是否定义文件读方法return-EINVAL;if(unlikely(!access_ok(VERIFY_WRITE,buf,count)))return-EFAULT;ret=rw_verify_area(READ,file,pos,count);//读
9、校验,if(ret>=0){count=ret;if(file->f_op->read)ret=file->f_op->read(file,buf,count,pos);//调用文件读操作方法elseret=do_sync_read(file,buf,count,pos);//通用文件模型读方法if(ret>0){fsnotify_access(file->f_path.dentry);add_rchar(current,ret);}inc_syscr(current);}returnret;}通过fil
10、p_open我们已经可以在当前进程的文件描述表中找到了file,于是我们就可以调用保存在file中的文件操作方法(file_operation)file->f_op->read(file,buf,count,pos)来具体的操作文件。上面的代码实现并不复杂,在做了一些条件判断以后,如果该文件索引节点inode定义了文件的读实现方法的话,就调用此方法。Linux下特殊文件读往往是用此方法,一些伪文件系统如:proc,sysfs等,读写文件也是用此方法。而如果没有定义此方法就会调用通用文件模型的读写方法.它最
11、终就是读内存,或者需要从存储介质中去读数据.参数:structfile*file:打开的文件返回的文件指针,(读的目标文件)char__user*buf:在用户空间开辟的一段内存空间的首地址,用来保存文件数据。size_tcount:指定读取文件中的多少内容。单位字节loff_t*pos:文件起始位置偏移值,若从文件头读取,则偏移值为0.可以在文件自身的信息中获取示例int*buf;loff_t*pos=&(file->f_p