linux内核中打开文件,linux内核中打开文件.docx

PAGE / NUMPAGES

首先分析一下sys_read系统调用(内核版本为2.6.19.4)。

源代码如下(摘自fs/read_write.c)

[c-sharp]? \o "view plain" view plain \o "copy" copy文档收集自网络,仅用于个人学习

SYSCALL_DEFINE3(read,?unsigned?int,?fd,?char?__user?*,?buf,?size_t,?count)??文档收集自网络,仅用于个人学习

{??

????struct?file?*file;??

????ssize_t?ret?=?-EBADF;??

????int?fput_needed;??

????file?=?fget_light(fd,?&fput_needed);??

????if?(file)?{??

????????loff_t?pos?=?file_pos_read(file);??

????????ret?=?vfs_read(file,?buf,?count,?&pos);??

????????file_pos_write(file,?pos);??

????????fput_light(file,?fput_needed);??

????}??

????return?ret;??

}??

这里用到了fget_light(),file_pos_read(),vfs_read(),file_pos_write(),fput_light()。文档收集自网络,仅用于个人学习

?

file_pos_read()和file_pos_write()(均位于fs/read_write.c)用来读取当前文件指针(即当前文件操作的位置)文档收集自网络,仅用于个人学习

fget_light()和fput_light()(位于fs/file_table.c和include/linux/file.h)必须是成对出现的!fget_light在当前进程的struct files_struct中根据所谓的用户空间文件描述符fd来获取文件描述符。另外,根据当前fs_struct是否被多各进程共享来判断是否需要对文件描述符进行加锁,并将加锁结果存到一个int中返回,?fput_light则根据该结果来判断是否需要对文件描述符解锁文档收集自网络,仅用于个人学习

vfs_read()(位于fs/read_write.c)调用具体文件系统的read函数来完成读操作,代码如下:文档收集自网络,仅用于个人学习

[cpp]? \o "view plain" view plain \o "copy" copy文档收集自网络,仅用于个人学习

ssize_t?vfs_read(struct?file?*file,?char?__user?*buf,?size_t?count,?loff_t?*pos)??文档收集自网络,仅用于个人学习

{??

????ssize_t?ret;??

????if?(!(file->f_mode?&?FMODE_READ))??

????????return?-EBADF;??

????if?(!file->f_op?||?(!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);??

????if?(ret?>=?0)?{??

????????count?=?ret;??

????????if?(file->f_op->read)??

????????????ret?=?file->f_op->read(file,?buf,?count,?pos);??

????????else??

????????????ret?=?do_sync_read(file,?buf,?count,?pos);??

????????if?(ret?>?0)?{??

????????????fsnotify_access(file->f_path.dentry);??

????????????add_rchar(current,?ret);??

????????}??

????????inc_syscr(current);??

????}??

????return?ret;??

}??

?

通过源码可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值