我改写了十年前开发的基于Windows的信号处理引擎。我现在希望它可以在Windows和Linux下运行。
理想情况下,我想使用可移植的C ++库来帮助解决这个问题,但我也准备好自己实现代码,如果这样做不那么重要 - 即将Windows系统调用映射到Linux系统调用。我不是Linux专家。
我在中央例程中删除对Windows对象模型的依赖性有困难:任务调度程序,它使用WaitForMultipleObjectsEx来实现proactor设计模式:
for (;;) {
while (WAIT_IO_COMPLETION == (evt_idx = ::WaitForMultipleObjectsEx(n_handles, events+current_eventlist_idx, FALSE, INFINITE, TRUE)))
;
evt_id = evt_idx+current_eventlist_idx-WAIT_OBJECT_0;
if (evt_id >= n_handles)
evt_id -= n_handles;
if (evt_id == 0) // 0 == terminate event
break;
// bump round-robin eventlist pointer
if (++current_eventlist_idx == n_handles)
current_eventlist_idx = 0;
// make zero indexed
--evt_id;
// execute the processor chain
(*schedules[evt_id].chain())();
}
以上是对Windows事件的循环轮询。 这些事件可能是:
由IO读取/写入以及通过QueueUserWorkItem排队用户工作项引发的Windows IO完成事件不会破坏上面代码中的while
循环:它们& #39;由Windows IO完成端口处理:这些事件导致WaitForMultipleObjectsEx
调用返回,但不会中断while
循环 - 它们允许I / O完成回调运行,之后任务计划程序立即启动另一个WaitForMultipleObjectsEx
调用,并继续等待任何用户代码触发的事件。
关于WaitForMultipleObjectsEx
的注意事项是,它允许从系统和用户代码同时等待非常异构的事件集。
我在Linux中找到的最接近的是使用poll(2)和eventfd(2)的组合 - 这是一个好方法吗?
Boost ASIO,我在其他应用程序中使用过,看起来它可以做我想要的,但我正在努力映射上述例程中的功能以使用它。我错过了什么吗?
我应该考虑其他便携式库吗?