2014-02-12 73 views
1

Windows上有兩個進程正在運行。他們通過命名管道相互溝通。當其中一個準備好發送消息時,我想要象Linux上的信號那樣異步驗證另一個進程,以便另一個進程不需要連續檢查管道。是否有一些類似的方法,如Windows上的信號機制或其他方式來解決我的問題?Windows上進程之間的異步信號或通知

回答

0

直接信號機制概念上不存在相同的方式(一個可能可能使用線程注入攻擊來模擬它,但甚至沒有考慮到這一點)。這不是什麼大問題,因爲你可以做其他事情。

可以採用名稱(如eventsemaphore)的每個等待內核對象都可以被不同的進程訪問。 您可以在同步原語上使用WaitForSingleObject,直到其他進程發出信號。這將是一個類似於Unix的準備就緒通知機制(不完全像優雅,但是具有相同的效果)。

但是,這甚至不是必需的。命名管道(不適用於匿名管道!)可以與重疊的I/O一起使用。這意味着您可以使用ReadFileEx從管道開始讀取,並且會在後臺逗留直到完成。
你可以把這種I/O想象成「火災和遺忘」。讀取操作被阻止時,您的進程繼續運行。當讀取操作完成時,它發出一個事件的信號或將完成消息發送到完成端口(您可以查詢),或者向最初的線程發佈異步過程調用(「APC」,這是一個更復雜的「回調」名稱)叫它。這與您在Windows下可以獲得的「信號」非常接近。
不幸,裝甲運兵車不相當工作的人都不願意,因爲他們只在一個「報警等待狀態」,你必須通過設置ALTERTABLE做明確執行的明確點(當一個線程在等待功能中標誌或呼叫NtTestAlert)。
Windows設計者爲什麼會這樣認爲這是「更安全」的可能原因,但從可用性的角度來看,它也更令人討厭。唉,這是它的工作原理。

請注意,重疊的I/O模型與準備就緒通知系統完全相反。 Linux操作系統。您不要詢問操作系統是否準備好要讀取,而是告訴操作系統讀取它,並且您可以通知您(或驗證)是否已完成

+0

感謝您的回覆。我發現WaitForSingleObject會阻止當前進程。但在我的過程中,我不希望進程被阻塞,而是會持續運行一個循環。而且我不想檢查每個循環中的管道。這就是爲什麼我需要異步方式來通知流程。 – Arthur

+0

然後用回調重疊'ReadFileEx'是唯一的選擇。您仍然需要「檢查」要調用的回調,因爲用戶級別的APC只在線程處於可警告等待狀態時才被調用,但通常您可以通過「例程」調用將其合併,無論如何, MsgWaitForMultipleObjects',或者你可以調用'NtTestAlert'來每次迭代(或每X次迭代一次)觸發所有未完成的APC,這非常快。不幸的是,你可以在Windows下發送信號(你可以發送_messages_,但不一樣,消息也必須被輪詢)。 – Damon