2015-05-17 35 views
0

假設我有一個綁定到套接字的進程,而不是自己創建4個當前進程的實例。epoll和多個進程

新進程繼承父套接字的文件描述符,並能夠對其執行「接受」。如果我將套接字描述符放入epoll並嘗試連接到套接字,則會通知所有4名工作人員(EPOLLIN)有一些要讀取/接受的數據。所有工作人員都試圖做出接受,其中3人失敗了,只有一個人可以接受。

我該如何解決這個問題? 這是太大的性能損失,讓大部分工作人員每次都在失敗連接時失敗。

這是怎麼回事?

+0

只有一個進程觸摸任何給定的套接字。實際上,關閉()其他套接字。 – bmargulies

+0

爲什麼你想讓四個進程在同一個套接字上監聽呢?典型的模式是讓一個進程監聽並接受傳入的連接,然後派生一個工作人員來處理單個連接(*不是監聽套接字)。 – Wyzard

回答

0

如果accept()返回-1/EWOULDBLOCK/EAGAIN,則返回到輪詢循環。

0

在epoll fd中添加套接字時使用EPOLLONESHOT,它應該只通知一個事件的一個進程。

或者您可以保護epoll fd,以便只有一名工人在epoll fd上等待。