我有一个程序,用作侦听端口5000的TCP服务器。
现在我想运行另一个命令行进程与该服务器并行运行。我知道正确的方法是分叉服务器,而不是调用“exec”....
我的问题是,子进程是否也“拥有”这个端口5000?如果我想释放这个端口5000,我是否需要杀死父进程和子进程?
我很好奇如何在分叉中处理这个套接字连接。
答案 0 :(得分:24)
accept()
传入连接。接受进程现在有一个侦听套接字句柄和新接受的套接字。当关闭对句柄的所有引用时,将回收各种套接字资源。如果进程终止,则隐式关闭其所有句柄。因此,如果一个子关闭它继承到侦听套接字的句柄,则该父接口中存在该套接字剩余的唯一句柄。然后,当父节点终止时,将回收侦听套接字,或者显式关闭此句柄。
答案 1 :(得分:18)
是的,确实如此 无论何时创建子进程,它都会从父进程获取文件描述符表的副本。并且存在与每个文件描述符相对应的引用计数,即当前访问文件/套接字的进程数。因此,如果套接字在主进程中打开并且创建了子进程,则引用计数也会递增,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会递减。当引用计数达到零时,套接字最终关闭。