免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2296 | 回复: 7
打印 上一主题 下一主题

[网络子系统] 问一个针对socket的read的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-12 00:17 |只看该作者 |倒序浏览
最近在研究socket,碰到一个困惑一直解决不了,想请各位高手帮忙指点一下~~
在net/socket.c中有针对ioctl,send,bind等系统调用的原型,对于read函数,则是在read_write.c中给出定义:
  1. SYSCALL_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.         file = fget_light(fd, &fput_needed);
  7.         if (file) {
  8.                 loff_t pos = file_pos_read(file);
  9.                 ret = vfs_read(file, buf, count, &pos);
  10.                 file_pos_write(file, pos);
  11.                 fput_light(file, fput_needed);
  12.         }

  13.         return ret;
  14. }
复制代码
我一直没有找到这里的read调用了和socket相关的哪个函数,而且对于socket文件要读取的话这个pos读取位置又是指向了哪里呢?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2012-05-12 09:25 |只看该作者
回复 1# comeona1
我一直没有找到这里的read调用了和socket相关的哪个函数

建议看看vfs部分代码。
一最新的内核代码为例(这部分的改动不是很大,除了异步读写这块),流程是这样的:
sys_read---》vfs_read---》file->f_op->read---》sock_aio_read---》do_sock_read---》...

其中关键在网络vfs的建立。
这部分代码在:
net/socket.c
sock_alloc_file---》file->f_op=socket_file_ops....

socket_file_ops的定义如下:
static const struct file_operations socket_file_ops = {
        .owner =        THIS_MODULE,
        .llseek =        no_llseek,
        .aio_read =        sock_aio_read,
        .aio_write =        sock_aio_write,
        .poll =                sock_poll,
        .unlocked_ioctl = sock_ioctl,
#ifdef CONFIG_COMPAT
        .compat_ioctl = compat_sock_ioctl,
#endif
        .mmap =                sock_mmap,
        .open =                sock_no_open,        /* special open code to disallow open via /proc */
        .release =        sock_close,
        .fasync =        sock_fasync,
        .sendpage =        sock_sendpage,
        .splice_write = generic_splice_sendpage,
        .splice_read =        sock_splice_read,
};



   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2012-05-12 09:36 |只看该作者
回复 1# comeona1
对于socket文件要读取的话这个pos读取位置又是指向了哪里呢?

socket读取的时候,没有pos的概念。这个只是为了跟普通的文件系统兼容。socket的read pos必须为0。否则返回ESPIPE。

   

论坛徽章:
0
4 [报告]
发表于 2012-05-14 10:19 |只看该作者
本帖最后由 comeona1 于 2012-05-14 10:27 编辑

回复 3# 瀚海书香


    谢谢指点  

论坛徽章:
0
5 [报告]
发表于 2012-05-14 10:24 |只看该作者
回复 2# 瀚海书香


    哦我知道了,对于socket的read最终会调用sock_recvmsg,谢谢啊,现在思路一下就清晰了~~:wink:

论坛徽章:
0
6 [报告]
发表于 2012-05-14 16:51 |只看该作者
本帖最后由 comeona1 于 2012-05-14 16:54 编辑

回复 2# 瀚海书香


    最后还有一点点小疑问,socket_file_ops的定义中只有.aio_read = sock_aio_read,这样的话file->f_op->read是怎么找到aio_read而不是去找read?而且sock_aio_read函数的定义如下:
  1. static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
  2.                                 unsigned long nr_segs, loff_t pos)
复制代码
read系统调用的输入参数应该是一块缓冲区buf,那么这里sock_aio_read的参数iocb,iov,nr_segs又是哪来的?谢谢啦~~

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
7 [报告]
发表于 2012-05-14 17:05 |只看该作者
回复 6# comeona1

查看下源代码,很简单的啊。。。

vfs_read()中会判断
  1. if (file->f_op->read)
  2.                         ret = file->f_op->read(file, buf, count, pos);
  3.                else
  4.                         ret = do_sync_read(file, buf, count, pos);
复制代码


do_sync_read()中
  1. for (;;) {
  2.        ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
  3.        if (ret != -EIOCBRETRY)
  4.                 break;
  5.        wait_on_retry_sync_kiocb(&kiocb);
  6. }
复制代码




   

论坛徽章:
0
8 [报告]
发表于 2012-05-14 19:07 |只看该作者
回复 7# asuka2001


    原来在do_sync_read里面,一直没找到呢,谢谢啦~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP