- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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????}1314????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????????else11????????????ret?=?do_sync_read(file,?buf,?count,?pos);12????????13????}1415????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????}1415????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创建过程中
您可能关注的文档
- 20150912新生军训服务说明书.docx
- 12医院财务内部控制制度.docx
- 2014-2015年标准合同模板目录.docx
- 2001-2013全国电子设计大赛元器件清单.docx
- 141124《基金业务外包服务指引》说明.docx
- 201560号应急演练文件.docx
- 2015国培项目现场实践成绩鉴定表.docx
- 2015学年第一学期政教处工作计划.docx
- 140630肉牛养殖项目环境影响报告表全本公示.doc
- 2015室内设计专升本设计任务书(主题酒店).doc
- 2024年江西省高考政治试卷真题(含答案逐题解析).pdf
- 2025年四川省新高考八省适应性联考模拟演练(二)物理试卷(含答案详解).pdf
- 2025年四川省新高考八省适应性联考模拟演练(二)地理试卷(含答案详解).pdf
- 2024年内蒙通辽市中考化学试卷(含答案逐题解析).docx
- 2024年四川省攀枝花市中考化学试卷真题(含答案详解).docx
- (一模)长春市2025届高三质量监测(一)化学试卷(含答案).pdf
- 2024年安徽省高考政治试卷(含答案逐题解析).pdf
- (一模)长春市2025届高三质量监测(一)生物试卷(含答案).pdf
- 2024年湖南省高考政治试卷真题(含答案逐题解析).docx
- 2024年安徽省高考政治试卷(含答案逐题解析).docx
文档评论(0)