簡體   English   中英

一次性*級* - 觸發的epoll():EPOLLONESHOT是否意味着EPOLLET?

[英]One-shot *level*-triggered epoll(): Does EPOLLONESHOT imply EPOLLET?

是否有可能使用epoll一個次級別 -triggered模式?
我搜索時找不到任何關於它的信息; 似乎每個人都使用邊緣觸發模式。

當選擇了EPOLLONESHOT標志並且你已經為一個套接字拉了一個事件時,那么套接字將不會像許多人想的那樣從epoll中刪除,但是它的事件被禁用了。 您可以使用epoll_ctl / EPOLL_CTL_MOD再次啟用它們。

EPOLLONESHOT行為很方便的一個示例是當您從套接字讀取可用數據到緩沖區時。 該緩沖區將被獨立清空,但在它不為空之前,您必須禁用套接字事件,即使套接字有其他數據。 然后在使用和清空緩沖區后,您可以重新啟用套接字。

邊緣和水平觸發的“一次性”行為之間的區別僅在您重新啟用套接字時才會出現。 一個例子:

  1. 套接字接收7K數據(現在它存儲在內核緩沖區中)
  2. 等待輸入事件,然后由於EPOLLONESHOT而禁用套接字事件。
  3. 您將4K讀入應用程序級緩沖區。
  4. 稍后,應用程序緩沖區將被使用並清空。 使用epoll_ctl / EPOLL_CTL_MOD重新啟用套接字。

等級觸發的EPOLLONESHOT:

  1. 由於內核緩沖區中仍存在3K數據,因此會再次觸發該事件。

邊緣觸發的EPOLLONESHOT:

  1. 它不會再次觸發可用數據的事件。 您必須通過閱讀並等待EAGAIN / EWOULDBLOCK

如果你想讓epoll停止在套接字上監聽,你應該使用EPOLLONESHOT。 如果您確實使用了EPOLLONESHOT,則必須在該套接字上的epoll信號之后將套接字添加回epoll。 因此EPOLLONESHOT不是EPOLLET。 您可以在沒有EPOLLET的情況下使用EPOLLONESHOT,但它可能效率不高。 如果你同時使用這兩個標志,那么你將不得不使用非阻塞套接字,並且只在recv時向epoll添加一個套接字並發送帶有EAGAIN錯誤的返回。 有關詳細信息,請參閱手冊頁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM