我有一个简单的C服务器接受我尝试使用telnet或netcat连接的连接。每次收到连接时,都会打印出描述符并在子进程中关闭连接。
我运行netcat的一个实例,连接到服务器,断开连接(Ctrl ^ C),然后重复几次。服务器端在所使用的描述符上打印的值是4,5,6,7 ..并且它还在不断增加。
我试过在一段时间后重复这个练习,价值仍在不断增加。我担心我的描述没有结束(尽管明确要求关闭)。
我应该处理一些信号,设置处理程序以关闭连接吗?
答案 0 :(得分:1)
你应该在fork之后关闭父进程中的套接字。 现在这不会关闭连接,只有当子进程也关闭套接字时,才会关闭连接。
答案 1 :(得分:1)
在fork
子进程拥有一组父文件描述符的复制后。因此,在fork之后,正确的过程是:(1)关闭子节点中父节点的侦听套接字,并(2)关闭子节点继承的新连接套接字在父母身上。
打开文件描述符是内核引用的引用。因此,当子进程继承连接套接字时,引用计数为2.在父进程关闭连接套接字后,计数保持为1直到子进程完成并关闭它。然后,引用计数降至0,然后关闭连接。 (省略了一些细节。)
结果是,在进行此更改之后,您会在父级中看到大量等于4的FD,因为即使子级正在处理多个连接,也会继续打开/关闭/重用相同的FD。