【发布时间】:2011-10-08 22:13:46
【问题描述】:
如果子进程没有关闭父进程打开的监听套接字文件描述符会发生什么?
如果两个进程都在监听主监听器 fd,哪个进程会被唤醒?
【问题讨论】:
如果子进程没有关闭父进程打开的监听套接字文件描述符会发生什么?
如果两个进程都在监听主监听器 fd,哪个进程会被唤醒?
【问题讨论】:
不会“唤醒”任何进程,您必须致电accept(2)。这就是正在发生的事情。
您创建一个套接字,它使内核分配大量资源、结构等。
s = socket(....);
您将套接字设置为“侦听状态”。内核注意到这一点并在结构中翻转一两个标志。
listen(s, -1);
您fork(2) 现在有两个文件描述符副本。一个连接到达。谁得到它?
谁先打电话给accept。如果两者都在等待accept,则无法确定顺序。
当一个连接到达时,内核将它添加到一个“未决连接”队列中。当任何具有该文件描述符的进程打开accept(2) 时,内核会从队列中删除一个连接并将其传递给调用者(返回一个新的文件描述符)。
作为结论,如果子进程继承了文件描述符,那么它只会有自己的机会接受连接。
【讨论】:
多个进程可以accept() 在同一个套接字上。当一个连接到达时,根据操作系统的不同,操作系统可能会唤醒一个进程或所有进程(雷鸣群),但无论如何,只有一个进程会成功accept()新连接。
【讨论】: