cwindowssocketsfopenfclose

How exactly does fopen(), fclose() work?


I was just wondering about the functions fopen, fclose, socket and closesocket. When calling fopen or opening a socket, what exactly is happening (especially memory wise)?

Can opening files/sockets without closing them cause memory leaks?

And third, how are sockets created and what do they look like memory wise?

I'm also interrested in the role of the operating system (Windows) in reading the sockets and sending the data.


Solution

  • Disclaimer: I'm mostly unqualified to talk about this. It'd be great if someone more knowledgeable posted too.

    Files

    The details of how things like fopen() are implemented will depend a lot on the operating system (UNIX has fopen() too, for example). Even versions of Windows can differ a lot from each other.

    I'll give you my idea of how it works, but it's basically speculation.

    If you open a file and never close it, some things will leak, yes. The FILE struct will leak, the FS driver's internal data will leak, the cache (if any) will leak too.

    But memory is not the only thing that will leak. The file itself will leak, because the OS will think it's open when it's not. This can become a problem for example in Windows, where a file opened in write-mode cannot be opened in write-mode again until it's been closed.

    If your app exits without closing some file, most OSes will clean up after it. But that's not much use, because your app will probably run for a long time before exiting, and during that time, it will still need to properly close all files. Also, you can't fully rely on the OS to clean up after you - it's not guaranteed in the C Standard.

    Sockets

    A socket's implementation will depend on the type of socket - network listen socket, network client socket, inter-process socket, etc.

    A full discussion of all types of sockets and their possible implementations wouldn't fit here.

    In short:

    All these things will leak if you don't close the socket.

    The role of the OS in sockets

    The OS implements the TCP/IP standard, Ethernet and other protocols needed to schedule/dispatch/accept connections and to make them available to user code via an API like Berkeley Sockets.

    The OS will delegate network I/O (communication with the network card) to the network driver.