![](/img/trans.png)
[英]epoll: difference between level triggered and edge triggered when EPOLLONESHOT specified
[英]One-shot *level*-triggered epoll(): Does EPOLLONESHOT imply EPOLLET?
是否有可能使用epoll
一個次級別 -triggered模式?
我搜索時找不到任何關於它的信息; 似乎每個人都使用邊緣觸發模式。
當選擇了EPOLLONESHOT
標志並且你已經為一個套接字拉了一個事件時,那么套接字將不會像許多人想的那樣從epoll中刪除,但是它的事件被禁用了。 您可以使用epoll_ctl
/ EPOLL_CTL_MOD
再次啟用它們。
EPOLLONESHOT
行為很方便的一個示例是當您從套接字讀取可用數據到緩沖區時。 該緩沖區將被獨立清空,但在它不為空之前,您必須禁用套接字事件,即使套接字有其他數據。 然后在使用和清空緩沖區后,您可以重新啟用套接字。
邊緣和水平觸發的“一次性”行為之間的區別僅在您重新啟用套接字時才會出現。 一個例子:
epoll_ctl
/ EPOLL_CTL_MOD
重新啟用套接字。 等級觸發的EPOLLONESHOT:
邊緣觸發的EPOLLONESHOT:
EAGAIN
/ EWOULDBLOCK
。 如果你想讓epoll停止在套接字上監聽,你應該使用EPOLLONESHOT。 如果您確實使用了EPOLLONESHOT,則必須在該套接字上的epoll信號之后將套接字添加回epoll。 因此EPOLLONESHOT不是EPOLLET。 您可以在沒有EPOLLET的情況下使用EPOLLONESHOT,但它可能效率不高。 如果你同時使用這兩個標志,那么你將不得不使用非阻塞套接字,並且只在recv時向epoll添加一個套接字並發送帶有EAGAIN錯誤的返回。 有關詳細信息,請參閱手冊頁。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.