socket:
socket是基于tcpip协议的网络通信模型。socket在各种编程语言中,socket数据结构提供socket操作的通用接口,而socket的执行细节是操作系统内核来做的。

socket系统调用:

创建一个socket,经过vfs文件系统执行流程 最终生成file、socket结构体等为实现套接字功能所需的一整套数据结构 。然后把socket结构体“映射”到一个已打开的文件(file结构体)中。

socket结构体是面向协议栈的包含了socket的各种方法 。


file结构体是面向vfs虚拟文件系统的, 内部最终会指向内存中的socket结构体。

socket管道、磁盘、文件, 这些在linux系统下会被抽象成文件,一个进程中维护一个文件项表和打开文件描述符表。socket也有对应的文件系统类型叫sockfs。(这个文件系统类型是决定当发生socket系统调用时在alloc_inode阶段生成的是socket结构体。而不是其他的file类型。)



映射过程:



映射是通过文件描述符(fd)是一个非负整数,就是一个打开文件数组的一个空闲项的下标。

一个进程中维护一个文件项表和打开文件描述符表,映射就是从该进程的文件项表 是个数组(存储file结构体), 然后找到一个空闲的项,返回其数组下标。

获得一个没有被占用的空文件描述符以后,会创建一个新的file结构体,并为该结构体注册操作函数,并且将该结构体存到该fd对应文件项表中。然后就可以 通过fd即下标 来访问对应的file结构体。

文件描述符 用于获取对应的file结构体 并最终找到对应的操作实体 比如内存中的socket结构体。


所有打开文件描述符在一个进程内被管理,对应着打开的文件项,而这是联系io模型的数据基础。


这样在c语言中使用select模型 轮询socket时就能理解用为什么要用到文件描述符这个概念。



file结构体:


file结构体提供了基本的read write等函数,具体的实现根据内部不同的inode类型(比如是socket)来定。


file结构体 就是用来实现内核 与文件、设备、管道、套接字 数据交互的一个门面结构。