linux 套接口文件_每天花一分钟,学习一下linux 之 socket 的原理

这次接着写关于linux 套接口的相关知识,我们知道,有这么一句话,说的是在linux上一切皆文件,说白了,linux上的很多子系统都可以像操作文件一样的使用它们,同理,linux的socket也是一样的道理。

Linux为了能使socket的相关操作和文件IO一样,linux专门提供了套接口文件,用一个数据结构来表示,即socket_file_ops,进程在创建套接口时,可以将进程的file指针指向socket_file_ops,这样进程对该file的操作,就全都转化为socket的操作,结构如下所示:

077170a17f12847da266174f9526a381.png

图1

可以看到,这个数据结构里面有读写函数,当进程调用poll函数时,用户态切换到内核态后,调用的是内核函数sock_poll,sock_file_ops可以认为是用户态操作socket的跳转表,也正是由于有了这张跳转表,才使得用户可以像操作文件一样,操作套接口。

当用户态进程调用socket时,返回一个文件描述符,也就是用户是通过文件描述符来访问套接口的,那么为了能够访问套接口,需要将文件描述符和套接口进行绑定操作,在linux内核中进行绑定的函数是sock_map_fd,函数如下:

1f0ffd07cbdd9fc1c3efddbde8170f0b.png

图2

大家可以看到,该函数首先调用 sock_alloc_fd 来分配描述符,和struct file 结构,然后调用 sock_attach_fd 来进行file 和 sock的绑定,最后通过fd_install来将进程与struct file 的绑定,这样进程就可以通过 fd 来找到 struct file,找到了struct file 也就找到了 socket。

下面来看看sock_attach_fd的函数,如下所示:

a3d4a1c684742f5eedaf57270c7bf4b9.png

图3

上图是sock_attach_fd的实现,大家只看其中一行就行,也就是397行的代码,file->private_data=sock,是将sock结构赋值给file的私有指针,看完这行代码是不是觉得恍然大悟,说白了,绑定关系,就是这一行做的。

那么进程到socket的映射关系如下所示:

b9a2c4489c389a30ae0df470be8da897.png

图4

就写到这里吧,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值