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

我想我了解如何使用kqueue()和kevent(),但是我不清楚传递给kevent()的事件如何查找相关操作:
假设有一个名为“ event”的结构kevent变量。
让我们假设,我们没有问题找到一个新的事件ID,该事件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){//这是我的事件! 做一点事! }

看到了吗? 在上面的EV_SET()调用中查看我需要帮助的地方。
对于用例1(手动重置事件),与用例2(自动重置事件)相比,操作(1)创建看上去可能有所不同。
操作(3)和(4)我完全处于黑暗中。 这些可能需要EV_ENABLE / EV_DISABLE吗? EV_CLEAR安装在哪里?
到目前为止,我认为除了“调度”之外,我不需要执行任何操作(6)。 我非常肯定,操作(5)可以像我上面给出的那样工作。

我现在花了一天的时间来尝试查找说明如何完成工作的文档或样本。 我在苹果代码库中找到了一个kqueue测试程序,但我对此表示怀疑。 同样,它在测试中仅发送1个事件,并且该事件终止接收线程的循环。 因此,这无助于我了解2个用例的详细信息。

我打算现在在x86机器上的FreeBsd 9.1下使用它。

===============>>#1 票数:5 已采纳

经过一些试验,我发现:

  1. 创建用户事件:EV_SET(&ev,标识符,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. 等待代码段:如原始文章中所述。

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

用户事件具有2种状态-发出信号,未发出信号。 EV_ENABLE和EV_DISABLE设置这些状态。

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

  ask by BitTickler translate from so

未解决问题?本站智能推荐: