代码之家  ›  专栏  ›  技术社区  ›  BitTickler

对EVFILT_USER使用kqueue

  •  3
  • BitTickler  · 技术社区  · 13 年前

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

    我想我理解如何使用kqueue()和kevent(),但我不清楚传递给kevent的事件是如何查找相关操作的:
    假设有一个名为“event”的结构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,空)
    5. 脉冲用户事件:EV_SET(&event,eventId,EVFILT_user,0,NOTE_TRIGGER,0,NULL)
    6. 在等待循环中,我认为剪辑会出现:如果(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机器上使用它。。。目前。

    1 回复  |  直到 13 年前
        1
  •  7
  •   user2173833    13 年前

    经过一番试验,我发现:

    1. 创建用户事件:EV_SET(&EV,标识符,EVFILT_user,EV_ADD,NOTE_FFCOPY,0,NULL)
    2. 销毁用户事件:EV_SET(&EV,标识符,EVFILT_user,EV_DELETE,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. 等待代码片段:如原始帖子中给出的。

    测试就像一种魅力。 在我的测试中,我做了NOTE_FFCOPY的事情,但我认为没有必要。

    用户事件有两种状态——已发出信号,未发出信号。EV_ENABLE和EV_DISABLE似乎设置了这些状态。

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