我很难理解如何将kqueue用于用户空间事件。
我寻找两个用例。
用例1:手动重置事件
用例2:自动重置事件
我想我理解如何使用kqueue()和kevent(),但我不清楚传递给kevent的事件是如何查找相关操作的:
假设有一个名为“event”的结构kevent变量。
让我们假设,我们可以毫不费力地找到一个新的事件id,它不会与该kqueue实例的其他事件id冲突,名为“eventId”。
-
创建用户事件:EV_SET(&event,eventId,EVFILT_user,EV_ADD,NOTE_FFNOP,0,NULL)
-
销毁用户事件:EV_SET(&event,eventId,EVFILT_user,EV_Destroy,NOTE_FFNOP,0,NULL)
-
设置用户事件:EV_Set(&event,eventId,EVFILT_user,????,NOTE_FFNOP,0,NULL)
-
重置用户事件:EV_SET(&event,eventId,EVFILT_user,?EV_CLEAR???,
NOTE_FFNOP,0,空)
-
脉冲用户事件:EV_SET(&event,eventId,EVFILT_user,0,NOTE_TRIGGER,0,NULL)
-
在等待循环中,我认为剪辑会出现:如果(event.filter==EVFILT_USER&&event.ident==eventId){//这是我的事件!做点什么!}
看到了吗????在上面的EV_SET()调用中,查看哪里需要帮助。
对于用例1(手动重置事件),与用例2(自动重置事件)相比,操作(1)Create可能看起来有所不同。
操作(3)和(4)我完全蒙在鼓里。我可能需要EV_ENABLE/EV_DISABLE吗?EV_CLEAR在哪里合适?
到目前为止,我认为除了“调度”之外,我不需要在操作(6)中做任何事情。
我很肯定,这个操作(5)可以像我上面给出的那样起作用。
我现在花了一整天的时间试图找到证明它是如何完成的文件或样本。我在苹果代码库中发现了一个kqueue测试程序,但我怀疑它做得对。此外,它在测试中只发送1个事件,该事件终止接收线程的循环。因此,这无助于我理解我的2个用例的细节。
我计划在FreeBsd 9.1下在x86机器上使用它。。。目前。