如何在分叉进程中处理套接字连接
Posted
技术标签:
【中文标题】如何在分叉进程中处理套接字连接【英文标题】:How is socket connection being handled in a forked process 【发布时间】:2011-08-26 05:21:28 【问题描述】:例如,我有一个用作 TCP 服务器的程序,它侦听端口 5000。
现在我想运行另一个命令行进程以与此服务器并行运行。我知道正确的方法是分叉服务器,而不是调用“exec” ....
我的问题是,子进程是否也“拥有”这个端口 5000?如果我想释放这个5000端口,是不是需要把父进程和子进程都杀掉?
我只是很好奇这个套接字连接是如何在分叉中处理的。
【问题讨论】:
当有新连接传入或之前,你会 fork() 吗? @Simone,我在建立新连接后分叉。 @ushfish 所以马特的回答是正确的。 【参考方案1】:-
首先,
accept()
传入连接。接受进程现在有了监听套接字的句柄,以及新接受的套接字。
叉子和:
在儿童中:
-
关闭监听套接字。
使用接受的套接字执行操作。
-
关闭接受的套接字。
继续接受循环。
当所有对句柄的引用都关闭时,将回收各种套接字资源。如果一个进程终止,它的所有句柄都会隐式关闭。因此,如果子进程关闭它继承给侦听套接字的句柄,则该套接字的唯一句柄存在于父进程中。然后当父进程终止或显式关闭此句柄时,监听套接字将被回收。
【讨论】:
【参考方案2】:是的,确实如此 每当创建子进程时,它都会从父进程获取文件描述符表的副本。并且每个文件描述符都有一个对应的引用计数,即当前访问该文件/套接字的进程数。因此,如果套接字在主进程中打开并创建了子进程,则引用计数会增加,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会减少。当引用计数达到零时,套接字最终关闭。
【讨论】:
以上是关于如何在分叉进程中处理套接字连接的主要内容,如果未能解决你的问题,请参考以下文章