是否有机会触发不知道拥有队列的事件?有其他选择吗?

时间:2019-05-24 12:58:15

标签: c++ c macos darwin

我需要设计一个“等待事件对象”的东西,它可以接受不透明的事件对象,并且能够阻塞直到发出其中一个信号。它应该可以在MacOS / Linux / Windows上运行。因此,对于Linux / Windows,一切都非常好:

  1. 在Windows上,我可以将CreateEvent中的本机事件包装到我的伪类和进行等待调用WaitForMultipleObjects的类中。
  2. 在Linux上,我可以将eventfd()poll()/epoll()混合使用,并达到相同的目的。
  3. 在MacOS上,我可以将kqueuekeventEVFILT_USER一起使用,但问题是我无法触发事件,而又不知道队列/已将事件添加到队列中,在Windows / Linux上不是问题,我可以设置事件或写入描述符。

我的问题是,我有没有机会错过任何东西,并且实际上可以使用kevent并以某种方式触发它,以便以后添加到队列中时,它会发出信号?我不是在谈论编写用户空间代码,这可以说是知道没有队列就设置了事件,然后在添加到队列中后才发出信号,我知道我可以做到,但是我非常想如果有的话,请使用OS内核原语。当然,此摘录来自手册页:

  

EVFILT_USER建立由标识标识的用户事件,该事件不是               与任何内核机制相关联,但由               用户级代码。

种种清除所有希望。然后是一个后续问题-是否还有其他MacOS内核机制的行为类似于事件和eventfd()

1 个答案:

答案 0 :(得分:1)

您可以像在Linux上使用eventfd()一样使用管道。

您还可以使用Mach端口和EVFILT_MACHPORT