首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对EVFILT_USER使用kqueue

对EVFILT_USER使用kqueue
EN

Stack Overflow用户
提问于 2013-04-18 00:08:41
回答 1查看 3.2K关注 0票数 3

我很难理解,如何将kqueue用于用户空间事件。

我寻找两个用例。

用例1:手动重置事件

用例2:自动重置事件

我想我理解如何使用kqueue()和kevent(),但是我不清楚如何将事件传递给kevent()来查找相关的操作:

让有一个名为"event“的struct变量。

让我们假设,我们没有问题找到一个新的事件id,它不会与那个名为"eventId“的kqueue实例的其他事件id发生冲突。

  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(手动重置事件),创建操作(1)可能与用例2(自动重置事件)不同。

操作(3)和(4)我完全处于黑暗中。我可能需要EV_ENABLE/EV_ those吗?EV_CLEAR在哪里合适?

到目前为止,我认为除了“调度”之外,我不需要在操作(6)中做任何事情。我很积极,那个手术(5)可以像我上面说的那样起作用。

现在,我花了更多的时间试图找到文档或示例来展示它是如何完成的。我在苹果代码库( apple codebase )中发现了一个kqueue测试程序,但我怀疑它是否正确。此外,它在测试中只发送一个事件,该事件终止接收线程的循环。因此,这并不能帮助我理解我的两个用例的细节。

我现在计划在FreeBsd 9.1下在x86 machine...for上使用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-18 10:18:20

经过一些实验,我发现:

  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. 脉冲用户事件:暂时不是tested...did用例1。
  6. 等待代码片段:在最初的文章中给出。

考试很有魅力。在我的测试中,我做了NOTE_FFCOPY的事情,但我不认为它是必要的。

用户事件有两个状态-信号,而不是信号。EV_ENABLE和EV_DISABLE似乎设置了这些状态。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16072395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档