2011-05-16 81 views
25

我有作为侦听端口5000,例如一个TCP服务器程序。如何套接字连接正在派生进程处理

现在我想运行其他命令行过程中与此并行服务器上运行。我知道这样做是叉的服务器,不是打电话“执行”以正确的方式....

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

我只是很好奇如何套接字连接在分叉被处理。

+0

当有新的连接进入或之前有fork()吗? – Simone 2011-05-16 07:12:21

+0

@Simone,我建立一个新的连接后分叉。 – CodeNoob 2011-05-18 02:12:03

+0

@ushfish所以马特的回答是正确的。 – Simone 2011-05-18 06:02:25

回答

20
  1. 首先,accept()传入连接。接受过程现在有一个监听套接字和新接受的套接字的句柄。
  2. 叉:
    • 在孩子:
      1. 关闭监听套接字。
      2. 用公认的套接字来做东西。
    • 在父:
      1. 关闭接受套接字。
      2. 恢复接受循环。

时手柄的所有引用关闭各种插座的资源将被回收。如果进程终止,则其所有句柄都隐式关闭。因此,如果一个孩子关闭了它继承到监听套接字的句柄,那么该父套接字中只剩下该套接字的唯一句柄。然后,监听套接字将在父节点终止时被回收,或者明确关闭该句柄。

13

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