我正在使用libev编写tcp服务器。 我在listen()之后创建socket和fork,然后在侦听套接字上启动一个libev读取监视器,并在watcher回调中接收客户端连接。 可能是这样的情况,当两者:孩子和父母(或两个孩子,如果有多个孩子)收到事件,即监听套接字变得可读并且都会尝试accept()客户端连接,在这种情况下,其中一个进程会阻塞? 我编写的测试程序,似乎只有一个进程收到准备好的事件,但也许我错了?在这里我可以阅读关于系统行为的地方?内核如何在进程之间进行负载均衡并决定谁将接收事件?它是后端(select,epoll等)和/或操作系统特定的?在childs中接收事件
3
A
回答
1
这两个进程都将收到来自套接字的准备就绪指示,并且两者都将因此调用accept()
。这就是为什么你应该总是使用基于事件的API(如socket()
,poll()
,epoll()
或kqueue()
)(或libev,它为其中一个或多个提供抽象)使用非阻塞文件描述符的原因之一。如果你使用非阻塞套接字,那么一个孩子将从accept()
得到一个成功的结果,其他所有人将得到一个EAGAIN
,忽略它,然后回去睡觉,没有任何伤害。
相关问题
- 1. MDIParents表单和Childs中的事件
- 2. 接收COM事件
- 3. 在SurfaceScrollViewer中接收操作事件
- 4. 在事件接收器中获取SPContext
- 5. 在OCUnitTest中无法接收NSInputStream事件
- 6. 在.NET中接收SENS事件
- 7. 在C++类中接收UI事件
- 8. 接收iPhone键盘事件
- 9. 接收双击事件
- 10. 事件接收器休息
- 11. 从iframe接收mousemove事件
- 12. SimpleOnScaleGestureListener只接收onScaleBegin事件
- 13. TWebBrowser - 挂钩接收事件
- 14. jqGrid拖放接收事件
- 15. ServiceHost消息接收事件?
- 16. 接收Flash中的Event.COPY事件
- 17. 接收鼠标中点击事件
- 18. NetStream在关闭后接收事件
- 19. 在编译时接收事件?
- 20. 如何在Java(TelNet)中实现接收套接字的事件?
- 21. 如何在Backbone中接收事件的链接属性?
- 22. JQuery Sortable - 禁用“接收”事件中的“更新”事件?
- 23. 活动在后台时如何接收事件总线事件
- 24. 从父控件接收MouseMove事件
- 25. 无法使用事件接收器在SharePoint中发送邮件
- 26. 无法接收事件广播接收器
- 27. 在Dynamics CRM中是否存在SharePoint的事件接收器
- 28. 在ios中接收邮件
- 29. 在IntentService中接收邮件
- 30. 通过事件参数接收控件文本的事件
使用非阻塞套接字是个好主意,谢谢 – user1940679