是否有机会在知道拥有队列的情况下触发 kevent w/o?任何替代品?
Any chance to trigger a kevent w/o knowing the owning queue? Any Alternatives?
我需要设计一个 "wait-for-event-objects" 东西,它可以接受不透明的事件对象并能够阻塞,直到其中一个被发出信号。它应该适用于 MacOS/Linux/Windows。所以 Linux/Windows 一切都很好:
- 在 Windows 上,我可以将来自
CreateEvent
的本机事件包装在我的伪 class 和执行等待调用 WaitForMultipleObjects
的 class 中。
- 在 Linux 上,我可以将
eventfd()
与 poll()/epoll()
混合使用并实现相同的效果。
- 在 Mac 上OS 我可以将
kqueue
和 kevent
与 EVFILT_USER
一起使用,但问题是我无法在不知道 [=38= 的情况下触发事件] 将事件添加到队列中,这在 Windows/Linux 上不是问题,我可以在其中设置事件或写入描述符。
我的问题是,是否有可能我遗漏了一些东西,我实际上可以使用 kevent
并以某种方式触发它,以便稍后添加到队列时它会发出信号?我不是在谈论编写用户 space 代码,让我们知道一个事件已经设置没有队列然后只是在添加到队列时发出信号,我知道我可以做到,但我会如果有的话,非常喜欢使用 OS 内核原语。当然,这是手册页的摘录:
EVFILT_USER Establishes a user event identified by ident which is not
associated with any kernel mechanism but is triggered by
user level code.
有点扫清了所有的希望。然后是一个后续问题 - 是否有任何其他 MacOS 内核机制的行为类似于事件和 eventfd()
?
您可以像在 Linux 上使用 eventfd()
一样使用管道。
您还可以使用 Mach 端口和 EVFILT_MACHPORT
。
我需要设计一个 "wait-for-event-objects" 东西,它可以接受不透明的事件对象并能够阻塞,直到其中一个被发出信号。它应该适用于 MacOS/Linux/Windows。所以 Linux/Windows 一切都很好:
- 在 Windows 上,我可以将来自
CreateEvent
的本机事件包装在我的伪 class 和执行等待调用WaitForMultipleObjects
的 class 中。 - 在 Linux 上,我可以将
eventfd()
与poll()/epoll()
混合使用并实现相同的效果。 - 在 Mac 上OS 我可以将
kqueue
和kevent
与EVFILT_USER
一起使用,但问题是我无法在不知道 [=38= 的情况下触发事件] 将事件添加到队列中,这在 Windows/Linux 上不是问题,我可以在其中设置事件或写入描述符。
我的问题是,是否有可能我遗漏了一些东西,我实际上可以使用 kevent
并以某种方式触发它,以便稍后添加到队列时它会发出信号?我不是在谈论编写用户 space 代码,让我们知道一个事件已经设置没有队列然后只是在添加到队列时发出信号,我知道我可以做到,但我会如果有的话,非常喜欢使用 OS 内核原语。当然,这是手册页的摘录:
EVFILT_USER Establishes a user event identified by ident which is not associated with any kernel mechanism but is triggered by user level code.
有点扫清了所有的希望。然后是一个后续问题 - 是否有任何其他 MacOS 内核机制的行为类似于事件和 eventfd()
?
您可以像在 Linux 上使用 eventfd()
一样使用管道。
您还可以使用 Mach 端口和 EVFILT_MACHPORT
。