2013-02-10 102 views
1

我正在寫這個FileDecriptor類(從t.i.abstract.FileDescriptor繼承)來偵聽/ sys中某個文件的事件。Twisted中邊緣觸發的epoll事件

不幸的是它只能用於Epoll的邊緣觸發模式。所以,我目前使用的一些hackish的解決方案將其添加後修改的epoll的列表我的文件描述符:

self.startReading() 
self._reactor._poller._control(_epoll.CTL_MOD, self.fileno(), _epoll.IN|_epoll.ET) 

有沒有一種更好的方式來做到這一點?這是否會引入任何問題(例如Twisted是否有可能在某個時候再次移除ET標誌)?

回答

0

Twisted很有可能會再次刪除此標誌。正如您在示例中看到的大量_ s,您在這裏使用了大量的私有API,並且它們都可能在沒有警告的情況下更改。

但是,沒有公共界面來做你想做的事情。在我看來,如果一個接口要求使用特定的sycall接口來查詢它的讀/寫就緒(如epoll),而不是遵循一些適用於epoll,select,, poll等的通用規則,那麼這是一個內核錯誤。我的第一個傾向將是針對Linux內核提交錯誤。但是,如果內核人員不會修復它,並且您想爲單元測試貢獻一個修補程序來公開此類linux + epoll的特定事件的公共接口,請隨時打開一張票。

0

有一點需要注意的是epoll文件描述符本身是由epoll機制支持的。

如果您確實需要以epoll reactor不支持的特定方式監視另一個描述符,您可以創建自己的epoll文件描述符,然後根據需要配置它,然後詢問epoll(或選擇或輪詢,甚至gtk)reactor來監視你的epoll文件描述符。當反應器說你的epoll文件描述符是可讀的,那麼你可以對它做一個零超時epoll_wait來學習它想告訴你什麼。

Twisted已經完全支持,您需要做的就是將IReadDescriptor接口作爲epoll文件描述符的包裝。

+0

有趣。你的意思是在我的ReadDescriptor中使用epoll對象的fileno()函數?我會嘗試。謝謝。 – Chris 2013-03-02 14:47:05