使用kqueue进行EVFILT_USER

时间:2013-04-18 00:08:41

标签: freebsd kqueue

我很难理解如何将kqueue用于用户空间事件 我找了2个用例 用例1:手动复位事件
用例2:自动重置事件

我想我明白了,如何使用kqueue()和kevent(),但我不清楚传递给kevent()的事件如何查找相关的操作:
让一个名为“event”的struct kevent变量 让我们假设,我们没有问题找到一个新的事件id,它不会与该kqueue实例的其他事件id发生冲突,名为“eventId”。

  1. 创建用户事件:EV_SET(& event,eventId,EVFILT_USER,EV_ADD,NOTE_FFNOP,0,NULL)
  2. 销毁用户事件:EV_SET(& event,eventId,EVFILT_USER,EV_DESTROY,NOTE_FFNOP,0,NULL)
  3. 设置用户事件:EV_SET(& event,eventId,EVFILT_USER,?????,NOTE_FFNOP,0,NULL)
  4. 重置用户事件:EV_SET(& event,eventId,EVFILT_USER,?? EV_CLEAR ???, NOTE_FFNOP,0,NULL)
  5. 脉冲用户事件:EV_SET(& event,eventId,EVFILT_USER,0,NOTE_TRIGGER,0,NULL)
  6. 在等待循环中,我认为剪切将是:if(event.filter == EVFILT_USER&& event.ident == eventId){//这是我的事件!做一点事! }
  7. 看到????在上面的EV_SET()调用中查看我需要帮助的地方 对于用例1(手动复位事件),操作(1)与用例2(自动复位事件)相比,创建可能看起来不同。
    操作(3)和(4)我完全处于黑暗中。我可能需要EV_ENABLE / EV_DISABLE吗? EV_CLEAR适合在哪里?
    到目前为止,我认为除了“调度”之外,我不需要在操作(6)中做任何事情。 我非常积极,操作(5)可以像我上面给出的那样工作。

    我现在花了一天时间试图查找文档或示例,了解它是如何完成的。我在苹果代码库中发现了一个kqueue测试程序,但我怀疑,它做得对。此外,它只在测试中发送1个事件,该事件终止接收线程的循环。所以它并没有帮助我理解我的2个用例的细节。

    我计划在x86机器上的FreeBsd 9.1下使用它......现在。

1 个答案:

答案 0 :(得分:4)

经过一些实验,我发现:

  1. 创建用户事件:EV_SET(& ev,identifier,EVFILT_USER,EV_ADD,NOTE_FFCOPY,0,NULL)
  2. 销毁用户事件:EV_SET(& ev,标识符,EVFILT_USER,EV_DELETE,0,0,0)
  3. 设置用户事件:EV_SET(& event,m_eventId,EVFILT_USER,EV_ENABLE,NOTE_FFCOPY | NOTE_TRIGGER | 0x1,0,NULL)
  4. 重置用户事件:EV_SET(& event,m_eventId,EVFILT_USER,EV_DISABLE,EV_CLEAR | NOTE_FFCOPY,0,NULL)
  5. 脉冲用户事件:未经测试......目前使用案例1。
  6. 等待代码段:正如原帖中所述。
  7. 测试就像魅力一样。 在我的测试中我做了NOTE_FFCOPY的事情,但我不认为这是必要的。

    用户事件有2个状态 - 已发信号,未发出信号。 EV_ENABLE和EV_DISABLE设置它们看起来的状态。

    测试证实,信号状态的事件实际上是由kevent()重复报告的。