How is socket connection being handled in a forked process

Vendetta picture Vendetta · May 16, 2011 · Viewed 16.6k times · Source

I have a program that serves as a TCP server that listens to port 5000, for example.

Now I want to run another command-line process to run in parallel with this server. I know the right way to do it is to fork the server, than call "exec" ....

My question is, is the child process also "owns" this port 5000? If I want to release this port 5000, do I need to kill both the parent process and the child process?

I am just very curious how this socket connection is being handled in the forking.

Answer

Matt Joiner picture Matt Joiner · May 16, 2011
  1. First, accept() the incoming connection. The accepting process now has a handle to the listening socket, and the newly accepted socket.
  2. Fork and:
    • In the child:
      1. Close the listening socket.
      2. Do stuff with the accepted socket.
    • In the parent:
      1. Close the accepted socket.
      2. Resume the accept loop.

The various socket resources will be reclaimed when all references to the handle are closed. If a process terminates, all its handles are closed implicitly. Therefore if a child closes the handle it inherits to the listening socket, the only handle remaining to that socket exists in the parent. Then the listening socket will be reclaimed when the parent terminates, or closes this handle explicitly.