Linux套接字与虚拟文件系统(二).doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux套接字与虚拟文件系统(二)

???接上篇初始化与创建,本篇阐述Socket操作和销毁两部分的实现。 Socket操作 ???系统调用read(v)、write(v)是用户空间读写socket的一种方法,为了弄清楚它们是怎么通过VFS将请求转发到特定协议的实现,下面以read为例(write同理),并假定文件描述符对应的是IPv4 TCP类型的socket,来跟踪它的执行流程。首先来看下sys_read的代码,定义在fs/read_write.c中。 ?1SYSCALL_DEFINE3(read,?unsigned?int,?fd,?char?__user?*,?buf,?size_t,?count) ?2{ ?3????struct?file?*file; ?4????ssize_t?ret?=?-EBADF; ?5????int?fput_needed; ?6 ?7????file?=?fget_light(fd,?fput_needed); ?8????if?(file)?{ ?9????????loff_t?pos?=?file_pos_read(file); 10????????ret?=?vfs_read(file,?buf,?count,?pos); 11???????? 12????} 13 14????return?ret; 15} ???先调用fget_light得到fd对应的file,再调用vfs_read。接着跟踪vfs_read的代码,定义在fs/read_write.c中。 ?1ssize_t?vfs_read(struct?file?*file,?char?__user?*buf,?size_t?count,?loff_t?*pos) ?2{ ?3????ssize_t?ret; ?4???? ?5????ret?=?rw_verify_area(READ,?file,?pos,?count); ?6????if?(ret?=?0)?{ ?7????????count?=?ret; ?8????????if?(file-f_op-read) ?9????????????ret?=?file-f_op-read(file,?buf,?count,?pos); 10????????else 11????????????ret?=?do_sync_read(file,?buf,?count,?pos); 12???????? 13????} 14 15????return?ret; 16} ???在上篇Socket创建一节已知,因为sockfs_file_ops没有定义read(即read指针为空),所以这儿实际调用了do_sync_read,继续跟踪它的代码,定义在fs/read_write.c中。 ?1ssize_t?do_sync_read(struct?file?*filp,?char?__user?*buf,?size_t?len,?loff_t?*ppos) ?2{ ?3????struct?iovec?iov?=?{?.iov_base?=?buf,?.iov_len?=?len?}; ?4????struct?kiocb?kiocb; ?5????ssize_t?ret; ?6 ?7???? ?8????for?(;;)?{ ?9????????ret?=?filp-f_op-aio_read(kiocb,?iov,?1,?kiocb.ki_pos); 10????????if?(ret?!=?-EIOCBRETRY) 11????????????break; 12????????wait_on_retry_sync_kiocb(kiocb); 13????} 14 15????if?(-EIOCBQUEUED?==?ret) 16????????ret?=?wait_on_sync_kiocb(kiocb); 17????*ppos?=?kiocb.ki_pos; 18????return?ret; 19} ???显而易见,这儿调用到了f_op-aio_read,使用异步读来实现同步读,若异步读没有完成,则调用wait_on_sync_kiocb等待。由上篇Socket创建一节可知sockfs_file_ops的aio_read设为sock_aio_read函数,定义在net/socket.c中,至此sys_read的实现完成了前一半(操作对象是file)而进入后一半(操作对象是socket),即socket层的实现。 ???在socket层跟踪sock_aio_read,可以得到最后调用的是sock-ops-recvmsg,由于socket类型为IPv4 TCP,因此sock-ops在socket创建过程中

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档