如何在分叉进程中处理套接字连接

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】:

是的,确实如此 每当创建子进程时,它都会从父进程获取文件描述符表的副本。并且每个文件描述符都有一个对应的引用计数,即当前访问该文件/套接字的进程数。因此,如果套接字在主进程中打开并创建了子进程,则引用计数会增加,因为它现在也在子进程中打开,并且当它在任何进程中关闭时,它会减少。当引用计数达到零时,套接字最终关闭。

【讨论】:

以上是关于如何在分叉进程中处理套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

分叉和传递套接字c ++

辅助库可以用于在不相关的进程(不是分叉的进程)之间共享接受的连接吗?

通过分叉为每个子进程提供唯一 ID

如何在python中杀死一个分叉的孩子及其jackd子进程

在不相关的进程之间共享套接字(监听)

如何在单独的线程中处理套接字请求,线程似乎阻塞了主进程