fopen(),fclose()是如何工作的?

我只是想知道函数fopen,fclose,socket和closesocket。 当调用fopen或打开一个套接字时,究竟发生了什么(特别是内存明智的)?

打开文件/套接字而不closures它们会导致内存泄漏?

第三,套接字是如何创build的,它们看起来像记忆方面的东西?

我也对操作系统(Windows)在读取套接字和发送数据方面的作用感兴趣。

免责声明:我基本上没有资格谈论这个。 如果有人更有见识,也会很棒。

例如fopen()这样的细节在很大程度上取决于操作系统(例如UNIX也有fopen())。 甚至Windows的版本也可能相差很多。

我会告诉你它是如何工作的,但基本上是猜测。

  • 调用时,fopen在堆上分配一个FILE对象。 请注意,FILE对象中的数据是未记录的 – FILE是一个不透明的结构 ,只能使用代码中的指向FILE的指针。
  • FILE对象被初始化。 例如,像fillLevel = 0 ,其中fillLevel是尚未刷新的缓冲数据量。
  • 调用文件系统驱动程序(FS驱动程序)打开文件并提供一个句柄,放在FILE结构中的某个位置。
    • 为此,FS驱动程序根据请求的路径计算出硬盘地址,并在内部记住这个硬盘地址,这样以后可以完成对fread等的调用。
      • FS驱动程序使用一种索引表(存储在HDD上)来找出与所请求的路径对应的HDD地址。 这将有很大的不同,取决于文件系统的类型 – FAT32,NTFS等等。
      • FS驱动程序依靠HDD驱动程序来执行对HDD的实际读取和写入。
  • 缓存可能被分配在RAM中的文件。 这样,如果用户请求读取一个字节,C ++可能会读取一个KB以防万一,以后的读取将是瞬间的。
  • 指向分配的文件的指针从fopen返回。

如果你打开一个文件而不关闭它,有些东西会泄漏,是的。 FILE结构将泄漏,FS驱动程序的内部数据将泄漏,缓存(如果有的话)也会泄漏。

但是记忆不是唯一会泄漏的东西。 文件本身会泄漏,因为操作系统会认为它不是打开的。 例如,在Windows中,以写模式打开的文件在关闭之前不能再次以写模式打开,这可能会成为问题。

如果您的应用程序没有关闭某个文件而退出,则大多数操作系统将在清理完成后清理。 但这并没有什么用处,因为你的应用程序在退出之前可能会运行很长时间,在这段时间内,它仍然需要正确关闭所有文件。 另外,你不能完全依靠操作系统进行清理,这在C标准中是不能保证的。

套接字

一个套接字的实现将取决于套接字的类型 – 网络监听套接字,网络客户端套接字,进程间套接字等。

所有类型的套接字及其可能的实现的完整讨论将不适合在这里。

简而言之:

  • 就像一个文件,一个套接字在RAM中保存一些信息,描述与其操作相关的东西,比如远程主机的IP。
  • 由于性能原因,它也可以在RAM中拥有缓存
  • 它可以保存有限的操作系统资源,如开放端口,使其他应用程序无法使用它们

所有这些东西会泄漏,如果你不关闭插座。

操作系统在套接字中的作用

操作系统实现了TCP / IP标准,以太网和其他协议,以调度/分派/接受连接,并通过API(如伯克利套接字)将其提供给用户代码。

操作系统会将网络I / O(与网卡通信)委托给网络驱动程序。