2017-10-07 80 views
2

當EPOLLONESHOT指定時,電平觸發和邊緣觸發模式有什麼區別?epoll:當EPOLLONESHOT指定時,電平觸發和邊沿觸發之間的差異

還有類似的問題here。 「蹲小貓」的答案似乎並不正確(據我所知,其他答案並不回答我的問題)。

我已嘗試以下步驟:

  • 服務器發送2個字節到客戶端,而客戶在epoll_wait
  • 客戶端返回等待從epoll_wait,然後讀取1個字節。
  • 客戶端再次發生事件(由於EPOLLONESHOT)
  • 客戶端再次調用epoll_wait。這裏,對於這兩種情況下(LT & ET),epoll_wait不等待,但(由「臥虎藏龍小貓」相反的答案)立即返回
  • 客戶端可以讀取第二個字節

有什麼區別當EPOLLONESHOT指定時,是否在ET & ET之間?

+0

如果你可以在上面發佈你的代碼,這將是非常好的。我相信你做了你聲稱你做過的事情,但這會讓下一個出現的人變得更好。 –

+0

@ShacharShemesh:不幸的是,這個代碼是一個更大框架的一部分。但是,我剛剛檢出了內核源代碼,據我瞭解,如果指定EPOLLONESHOT,則LT和ET之間確實沒有區別。我會等待一段時間,如果沒有回答,我會回答我自己的問題。 – geza

+0

這是當你中斷用晚餐寫答案時發生的事情。人們在你缺席的情況下找到自己的答案:-) –

回答

1

我認爲底線答案是「沒有差異」。

看着the code,fd似乎記得最後一組位在被單次禁用之前。它記得這是一槍,它記得它是否是ET。

這是徒勞無益的,因爲fd被禁用直到被修改,並且下一次調用EPOLL_CTL_MOD將會清除所有這些,並且替換爲新MOD所說的。

話雖如此,我不明白爲什麼有人會想要EPOLLETEPOLLONESHOT。對我而言,EPOLLET的全部意義在於,在某些編程模型(即微線程)下,它完全遵循語義。這意味着我可以在開始時將fd添加到epoll中,然後再也不必執行另一個與epoll相關的系統調用。另一方面,人們使用那些想要嚴格控制fd何時被監視和什麼時候不被監視的人來使用。根據定義,這與EPOLLET的用途相反。我只是不認爲這兩者在概念上是兼容的。

+0

這是什麼意思? 「這意味着我可以在開始時將fd添加到epoll中,然後再也不必執行另一個與epoll相關的系統調用」我認爲'epoll_wait'仍然會被調用,不是嗎? – geza

+0

加上,還有另一種組合,這似乎沒有道理:ET + EXCLUSIVE。你怎麼看待這件事? – geza

+0

沒有太多的經驗。我讀過它的方式,'EPOLLET'對於微線程是有用的,而獨佔和單線程對於多線程是有用的。因此,就你想使用它而言,我認爲不存在任何固有的摩擦。 –

相關問題