Windows上进程之间的异步信号或通知

Windows上进程之间的异步信号或通知,windows,asynchronous,signals,Windows,Asynchronous,Signals,有两个进程在Windows上运行。它们通过命名管道相互通信。当其中一个进程准备发送消息时,我希望像Linux上的signal一样异步通知另一个进程,这样另一个进程就不需要连续检查管道。有没有类似的方法,如Windows上的信号机制或其他方法来解决我的问题?概念上工作方式相同的直接信号机制并不存在。我们可能会用线程注入黑客来模拟它,但请不要考虑这一点。这不是什么大问题,因为你可以做其他事情 每个可等待的内核对象都可以采用名称,如a或a,可以由不同的进程访问。 您可以在同步原语上等待ForSingl

有两个进程在Windows上运行。它们通过命名管道相互通信。当其中一个进程准备发送消息时,我希望像Linux上的signal一样异步通知另一个进程,这样另一个进程就不需要连续检查管道。有没有类似的方法,如Windows上的信号机制或其他方法来解决我的问题?

概念上工作方式相同的直接信号机制并不存在。我们可能会用线程注入黑客来模拟它,但请不要考虑这一点。这不是什么大问题,因为你可以做其他事情

每个可等待的内核对象都可以采用名称,如a或a,可以由不同的进程访问。 您可以在同步原语上等待ForSingleObject,直到其他进程发出信号。这将是一种类似Unix的准备就绪通知机制,虽然没有那么优雅,但效果相同

然而,这甚至没有必要。命名管道不适用于任何匿名管道!可以与重叠I/O一起使用。这意味着您可以使用从管道开始读取,并且它将在后台逗留,直到完成为止。 您可以将这种I/O视为“火与忘”。读取操作被阻止时,进程继续运行。当读取操作完成时,它会向完成端口发送事件信号或发送完成消息,您可以查询或发送异步过程调用APC,这是对最初调用它的线程的回调的一个更奇特的名称。这是你在窗户下能看到的最接近信号的地方。 不幸的是,APC并不像人们希望的那样工作,因为它们只在线程处于可警报等待状态时在定义良好的点上执行,这必须通过在等待函数中设置altertable标志或调用NtTestAlert来显式执行。 Windows设计师之所以这样做,可能是因为这样更安全,但从可用性的角度来看,这也更令人恼火。唉,这就是它的工作原理


请注意,重叠I/O模型与Linux下的准备就绪通知系统完全相反。您可以告诉操作系统读取描述符,而不是询问操作系统是否已准备好读取描述符,这样您就可以得到通知或验证是否已完成此操作。

谢谢您的回复。我发现WaitForSingleObject将阻止当前进程。但是在我的进程中,我不希望进程被阻塞,相反,它将持续运行一个循环。我不想检查每个回路中的管道。这就是为什么我需要一种异步方式来通知流程。然后,将ReadFileEx与回调重叠是您唯一的选择。您仍然需要检查是否要调用回调,因为只有在线程处于可警报等待状态时才会调用用户级APC,但您通常可以将其与您无论如何都要执行的例程调用(如MsgWaitForMultipleObjects)结合起来,或者,您可以只调用NtTestAlert,每次迭代或每X次迭代触发一次所有挂起的APC,这非常快。不幸的是,你可以在Windows下发送信号你可以发送消息,但这不一样,消息也必须被轮询。