在并发服务器编程模型中,最简单的就是父进程监听外来连接请求,一旦请求到来,父进程fork()子进程处理连接,与外来客户端进行交互。
此时通用的做法是:父进程copy自己的地址空间给子进程,此时子进程拥有与父进程相同的打开的文件描述符!即,父子进程都有一个监听套接字、一个连接套接字。连接建立后,父进程关闭连接套接字,子进程关闭监听套接字。
我们知道,调用close()关闭套接字会导致tcp发送FIN分节。
但是为什么父子进程关闭这两个套接字没有导致连接的断开?
其实,在每个文件描述符或者套接字都有一个引用计数机制。只有当它的引用计数变为0的时候才会真正清理和释放该套接字的资源。
还有一个问题就是,如果父进程从来都不关闭连接套接字那会怎么办?
由于任何进程在任何时刻可拥有的打开着的描述符数量通常是有限制的。如果父进程不关闭连接套接字会导致套接字资源的耗尽,而且,没有一个客户连接会被终止。因为这些连接套接字的引用计数值永远是1,不可能为0.