如果child没有关闭父打开的侦听器套接字文件描述符会发生什么?

时间:2011-07-19 21:31:50

标签: sockets process

如果子节点未关闭父节点打开的侦听器套接字文件描述符会发生什么?

如果两个进程都在监听主侦听器fd上会被唤醒?

2 个答案:

答案 0 :(得分:1)

没有进程会被“唤醒”,你必须致电accept(2)。这是正在发生的事情。

您创建一个套接字,使内核分配大量资源,结构等。

s = socket(....);

您将套接字设置为“侦听状态”。内核会注意到这一点,并在结构中翻转一两个标记。

listen(s, -1);

fork(2)现在有两个文件描述符副本。连接到达。谁得到了它?

首先致电accept 的人。如果两者当前正在等待accept,则无法确定订单。

当连接到达时,内核将其添加到“挂起连接”队列中。当任何具有该文件描述符的进程打开accept(2)时,内核将从队列中删除一个连接并将其传递给调用者(返回一个新的文件描述符)。

作为结论,如果子进程继承了文件描述符,它就会自己获得接受连接的机会。

答案 1 :(得分:1)

同一个套接字上有几个进程accept()。当连接到达时,操作系统可能会唤醒一个进程或所有进程(雷鸣群),但无论如何,只有一个进程会成功accept()新连接。