gpt4 book ai didi

freebsd - 对 EVFILT_USER 使用 kqueue

转载 作者:行者123 更新时间:2023-12-01 11:45:02 27 4
gpt4 key购买 nike

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

我想我了解如何使用 kqueue() 和 kevent(),但我不清楚传递给 kevent() 的事件如何查找相关操作:
假设有一个名为“event”的 struct 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???,注_FFNOP,0,空)
  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) Create 与用例 2(自动重置事件)相比可能看起来有所不同。
操作(3)和(4)我完全一头雾水。我可能需要 EV_ENABLE/EV_DISABLE 吗? EV_CLEAR 适合哪里?
到目前为止,我假设除了"dispatch"之外,我不需要在操作 (6) 中做任何事情。我非常肯定,操作 (5) 可以像我上面给出的那样工作。

我现在花了大半天的时间试图找到说明它是如何完成的文档或示例。我在苹果代码库中发现了一个 kqueue 测试程序,但我怀疑它是否正确。此外,它只在测试中发送 1 个事件,并且该事件终止接收线程的循环。因此,它无法帮助我了解我的 2 个用例的详细信息。

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

最佳答案

经过一些实验,我发现:

  1. 创建用户事件:EV_SET(&ev, identifier, EVFILT_USER, EV_ADD, NOTE_FFCOPY, 0, NULL )
  2. 销毁用户事件:EV_SET(&ev, identifier, 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. Pulse 用户事件:未测试...目前使用案例 1。
  6. 等待代码片段:如原帖中所示。

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

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

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

关于freebsd - 对 EVFILT_USER 使用 kqueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com