每天花一分钟,学习一下linux 之 socket 的原理

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

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

每天花一分钟,学习一下linux 之 socket 的原理

图1

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

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

每天花一分钟,学习一下linux 之 socket 的原理

图2

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

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

每天花一分钟,学习一下linux 之 socket 的原理

图3

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

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

每天花一分钟,学习一下linux 之 socket 的原理

图4

就写到这里吧,谢谢。


分享到:


相關文章: