2013-02-10 99 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