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

Ven*_*tta 32 sockets port fork tcp process

例如,我有一个程序用作侦听端口5000的TCP服务器.

现在我想运行另一个命令行进程与该服务器并行运行.我知道正确的方法是分叉服务器,而不是调用"exec"....

我的问题是,子进程是否也"拥有"这个端口5000?如果我想释放这个端口5000,我是否需要杀死父进程和子进程?

我很好奇如何在分叉中处理这个套接字连接.

Mat*_*ner 24

  1. 首先,accept()传入连接.接受进程现在有一个侦听套接字句柄和新接受的套接字.
  2. 叉子和:
    • 在孩子:
      1. 关闭侦听套接字.
      2. 用接受的套接字做事.
    • 在父母:
      1. 关闭接受的套接字.
      2. 恢复接受循环.

当关闭对句柄的所有引用时,将回收各种套接字资源.如果进程终止,则隐式关闭其所有句柄.因此,如果一个子关闭它继承到侦听套接字的句柄,则该父接口中存在该套接字剩余的唯一句柄.然后,当父节点终止时,将回收侦听套接字,或者显式关闭此句柄.


man*_*avi 19

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