TCP/IP源码学习(48)——socket与VFS的关联(2)

简介: 作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net  本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。
作者:gfree.wind@gmail.com
博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net
 
 
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
======================================================================================================
继续昨天的学习。

昨天学习alloc_fd时,还有一个函数expand_files没有进入跟踪。
  1. int expand_files(struct files_struct *files, int nr)
  2. {
  3.     struct fdtable *fdt;

  4.     fdt = files_fdtable(files);

  5.     /*
  6.      * N.B. For clone tasks sharing a files structure, this test
  7.      * will limit the total number of files that can be opened.
  8.      */
  9.     /* 检查是否超过当前进程限定的最大可打开文件数 */
  10.     if (nr >= rlimit(RLIMIT_NOFILE))
  11.         return -EMFILE;

  12.     /* Do we need to expand? */
  13.     /* 
  14.     如果nr小于max_fds,即目前的文件表的个数已经超过了nr, 所以无需扩展。
  15.     这也说明,文件表只会增大,不会减小。
  16.     */
  17.     if (nr fdt->max_fds)
  18.         return 0;

  19.     /* Can we expand? */
  20.     /* 
  21.     检查是否超过了系统限定的最大可打开文件数
  22.     注意前面的检查为当前进程的打开文件数,此处的检查为系统可打开的文件数——所有进程
  23.     */
  24.     if (nr >= sysctl_nr_open)
  25.         return -EMFILE;

  26.     /* All good, so we try */
  27.     /* 真正去做expand*/
  28.     return expand_fdtable(files, nr);
  29. }
进入expand_fdtable
  1. static int expand_fdtable(struct files_struct *files, int nr)
  2.     __releases(files->file_lock)
  3.     __acquires(files->file_lock)
  4. {
  5.     struct fdtable *new_fdt, *cur_fdt;

  6.     spin_unlock(&files->file_lock);
  7.     /* 申请新的文件表 */
  8.     new_fdt = alloc_fdtable(nr);
  9.     spin_lock(&files->file_lock);
  10.     if (!new_fdt)
  11.         return -ENOMEM;
  12.     /*
  13.      * extremely unlikely race - sysctl_nr_open decreased between the check in
  14.      * caller and alloc_fdtable(). Cheaper to catch it here...
  15.      */
  16.     /* 如注释所示,由于竞争,有可能在申请nr个数的新文件表时,修改了sysctl_nr_open,导致新的文件表个数     小于我们所需要的。所以,这里需要对new_fdt->max_fds和nr进行判断。如果小于nr,那么expand失败 */
  17.     if (unlikely(new_fdt->max_fds = nr)) {
  18.         __free_fdtable(new_fdt);
  19.         return -EMFILE;
  20.     }
  21.     /*
  22.      * Check again since another task may have expanded the fd table while
  23.      * we dropped the lock
  24.      */
  25.     cur_fdt = files_fdtable(files);
  26.     /* 如注释所示,有可能另外一个进程已经扩展了文件表,所以这里再次判断 */
  27.     if (nr >= cur_fdt->max_fds) {
  28.         /* 复制文件表 */
  29.         /* Continue as planned */
  30.         copy_fdtable(new_fdt, cur_fdt);
  31.         rcu_assign_pointer(files->fdt, new_fdt);
  32.         /* 
  33.         对于文件表结构struct files_struct,其成员变量fd_array为一个大小为NR_OPEN_DEFAULT的数             组。这是一种常用的技巧。一般来说,进程的打开的文件不会太多,所以可以直接使用一个比较小的数组,这         样可以提高效率避免二次分配,同时由于数组较小,并不会太浪费空间。当文件个数超过数组大小的时候,再         重新申请内存。*/
  34.         if (cur_fdt->max_fds > NR_OPEN_DEFAULT)
  35.             free_fdtable(cur_fdt);
  36.     } else {
  37.         /* Somebody else expanded, so undo our attempt */
  38.         __free_fdtable(new_fdt);
  39.     }
  40.     return 1;
  41. }
expand_files结束之后,alloc_fd也学习完了,即宏get_unused_fd_flags也就结束了,那么我们就再次回到了函数sock_alloc_file,继续学习其调用的其它函数。


目录
相关文章
|
3月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
213 0
|
5月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
48 1
|
5月前
|
开发框架 网络协议 Unix
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别
61 1
|
1月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
88 1
|
6月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
95 0
|
3月前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
2月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
3月前
|
网络协议
socket编程(2) -- TCP通信
socket编程(2) -- TCP通信
39 0
|
4月前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
92 2
|
4月前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。
243 0