解决方法
档
fopen()如何实现的细节在很大程度上取决于操作系统(例如UNIX也有fopen()).甚至Windows版本可能会有很大的不同.
我会给你我的想法,它的运作方式,但它基本上是猜测.
>调用时,fopen会在堆上分配一个FILE对象.请注意,FILE对象中的数据是无文档的 – FILE是一个opaque struct,您只能从代码中使用指针到FILE.
> FILE对象被初始化.例如,像fillLevel = 0的那样,fillLevel是尚未刷新的缓冲数据量.
>对文件系统驱动程序(FS驱动程序)的调用打开文件并提供一个句柄,将其放在FILE结构中的某处.
>为了做到这一点,FS驱动程序计算出与所请求的路径相对应的硬盘地址,内部记住这个硬盘地址,以便以后可以实现对fread等的调用.
> FS驱动程序使用一种索引表(存储在HDD中)来计算与所请求路径对应的HDD地址.根据文件系统类型 – FAT32,NTFS等,这将有很大的不同.
> FS驱动程序依靠HDD驱动程序来执行HDD的实际读写操作.
>文件可能会在RAM中分配缓存.这样,如果用户请求读取1个字节,则C可以读取KB,以防止后续读取将是即时的.
>从fopen返回指向分配的FILE的指针.
如果你打开一个文件,不要关闭它,有些东西会泄漏,是的. FILE结构将泄漏,FS驱动程序的内部数据将泄漏,缓存(如果有的话)也会泄漏.
但记忆不是唯一会泄漏的事情.该文件本身将泄漏,因为操作系统会认为它是不开放的.这可能会成为一个问题,例如在Windows中,在写入模式下打开的文件无法在写模式下再次打开,直到它被关闭.
如果您的应用程序退出而不关闭一些文件,大多数操作系统将在之后清理.但这并没有太多的用处,因为你的应用程序可能会在退出之前运行很长时间,在这段时间内,它仍然需要正确关闭所有的文件.此外,您不能完全依靠操作系统来清理您 – C标准中不能保证.
套接字
套接字的实现将取决于套接字的类型 – 网络监听套接字,网络客户端套接字,进程间插座等.
所有类型的套接字及其可能的实现的完整讨论将不适用于此.
简而言之:
>就像文件一样,套接字在RAM中保存一些信息,描述与其操作相关的事情,例如远程主机的IP.
由于性能原因,它也可以在RAM中存储高速缓存
>它可以容纳有限的操作系统资源,如开放端口,使其无法使用其他应用程序
如果不关闭插座,所有这些都会泄漏.
操作系统在套接字中的作用
OS实施TCP / IP标准,以太网和其他协议,用于安排/调度/接受连接,并通过像Berkeley Sockets这样的API使其可用于用户代码.
操作系统将把网络I / O(与网卡的通信)委托给网络驱动程序.