我很难理解如何将kqueue用于用户空间事件
我找了2个用例
用例1:手动复位事件
用例2:自动重置事件
我想我明白了,如何使用kqueue()和kevent(),但我不清楚传递给kevent()的事件如何查找相关的操作:
让一个名为“event”的struct kevent变量
让我们假设,我们没有问题找到一个新的事件id,它不会与该kqueue实例的其他事件id发生冲突,名为“eventId”。
看到????在上面的EV_SET()调用中查看我需要帮助的地方
对于用例1(手动复位事件),操作(1)与用例2(自动复位事件)相比,创建可能看起来不同。
操作(3)和(4)我完全处于黑暗中。我可能需要EV_ENABLE / EV_DISABLE吗? EV_CLEAR适合在哪里?
到目前为止,我认为除了“调度”之外,我不需要在操作(6)中做任何事情。
我非常积极,操作(5)可以像我上面给出的那样工作。
我现在花了一天时间试图查找文档或示例,了解它是如何完成的。我在苹果代码库中发现了一个kqueue测试程序,但我怀疑,它做得对。此外,它只在测试中发送1个事件,该事件终止接收线程的循环。所以它并没有帮助我理解我的2个用例的细节。
我计划在x86机器上的FreeBsd 9.1下使用它......现在。
答案 0 :(得分:4)
经过一些实验,我发现:
测试就像魅力一样。 在我的测试中我做了NOTE_FFCOPY的事情,但我不认为这是必要的。
用户事件有2个状态 - 已发信号,未发出信号。 EV_ENABLE和EV_DISABLE设置它们看起来的状态。
测试证实,信号状态的事件实际上是由kevent()重复报告的。