Windows上运行了2个进程。它们通过命名管道相互通信。当其中一个准备好发送消息时,我想要像Linux上的信号那样异步地通知其他进程,以便其他进程不需要连续检查管道。是否有一些类似的方法,如Windows上的信号机制或其他方式来解决我的问题?
答案 0 :(得分:0)
概念上以相同方式工作的直接信号机制不存在(一个可能可能通过线程注入黑客来模拟它,但是甚至没有想到这一点)。这不是什么大问题,因为你可以做其他事情。
每个可以采用名称的可等待的内核对象(例如event或semaphore)都可以被不同的进程访问。
您可以在同步原语上WaitForSingleObject
,直到其他进程发出信号。这将是一个类似Unix的准备通知机制(不太优雅,但效果相同)。
然而,这甚至不是必要的。命名管道(对于 anyonymous 管道不适用!)可以与重叠I / O一起使用。这意味着您可以使用ReadFileEx
从管道中启动读取,它将在后台停留,直到它完成。
您可以将这种I / O视为“火与忘”。在读取操作被阻止时,您的进程将继续运行。当读取操作完成时,它向一个事件发出信号或将完成消息发送到完成端口(您可以查询)或将异步过程调用(“APC”,一个更为花哨的“回调”名称)发布到最初的线程叫它。这与Windows下的“信号”接近
不幸的是,APC并不像人们希望的那样完全工作,因为它们只在明确定义的点执行(当线程处于“可警告的等待状态”时,你必须明确地 通过在等待函数中设置可更改标志或调用NtTestAlert
)
可能的原因是,为什么Windows设计师这样做是“更安全”,但从可用性的角度来看也更令人讨厌。唉,这就是它的运作方式。
请注意,重叠的I / O模型与准备就绪通知系统完全相反。 Linux操作系统。您可以告诉操作系统读取它,而不是要求操作系统读取描述符 ready ,而是让您自己得到通知(或验证)是否已完成 >