在前面我们说过,linux系统一切皆文件,网络编程,也可以像操作文件一样进行处理,当某个进程创建完套接口后,就可以通过文件描述符进行读写数据,因此linux内核就得提供,通过文件描述符来获取套接口的操作函数,而操作函数就是sockfd_lookup_light,函数如下所示:
![ad6db1711d57bb8e2bf197dbe5fc9998.png](https://i-blog.csdnimg.cn/blog_migrate/c6b15bd143901723d5b41c67634dd74c.jpeg)
图1
参数解释如下:
fd: 文件描述符。
err: 错误的操作码,当函数执行出错时,将操作码放到err中,将其带回。
fput_needed:引用计数相关的参数。
462行: 调用fget_light内核函数,根据文件描述符fd获取文件描述符的结构指针struct file。
463-469:如果成功的返回了struct file指针,则根据file指针获取网络套接口sock,即 struct socket。
下面看看sock_from_file的实现:
![284421194d3f4a1605f8b72d011318d8.png](https://i-blog.csdnimg.cn/blog_migrate/fd09051921c9fab14128228f7ca3af71.jpeg)
图2
419行:根据文件操作表的函数指针来进行判断,如果file的文件操作表的指针是网络的文件操作表,则返回file->private_data的指针,因为,file->private_data的值是在sock_attach_fd函数中被设置的,这个不清楚的话,可以看我之前发的文章。
进程和文件描述符以及和套接口的关系,我给整理了一下结构图,如下所示:
![956665aa2325a0ec62e127c4378ee104.png](https://i-blog.csdnimg.cn/blog_migrate/53ab76c1bde860ce0c1be458c38d8cae.jpeg)
图3
Linux内核中,是通过current->files->fd_array[fd]就可以访问当前进程fd所对应的文件描述符的实例,在struct file中,有两个成员是比较重要的,一个是private_data,一个是f_op,f_op指向了struct file_operations,对于网络文件描述符,这个结构里存的是网络的操作集合。
今天就写到这里吧,谢谢。