Windows上有兩個進程正在運行。他們通過命名管道相互溝通。當其中一個準備好發送消息時,我想要象Linux上的信號那樣異步驗證另一個進程,以便另一個進程不需要連續檢查管道。是否有一些類似的方法,如Windows上的信號機制或其他方式來解決我的問題?Windows上進程之間的異步信號或通知
1
A
回答
0
直接信號機制概念上不存在相同的方式(一個可能可能使用線程注入攻擊來模擬它,但甚至沒有考慮到這一點)。這不是什麼大問題,因爲你可以做其他事情。
可以採用名稱(如event或semaphore)的每個等待內核對象都可以被不同的進程訪問。 您可以在同步原語上使用WaitForSingleObject
,直到其他進程發出信號。這將是一個類似於Unix的準備就緒通知機制(不完全像優雅,但是具有相同的效果)。
但是,這甚至不是必需的。命名管道(不適用於匿名管道!)可以與重疊的I/O一起使用。這意味着您可以使用ReadFileEx
從管道開始讀取,並且會在後臺逗留直到完成。
你可以把這種I/O想象成「火災和遺忘」。讀取操作被阻止時,您的進程繼續運行。當讀取操作完成時,它發出一個事件的信號或將完成消息發送到完成端口(您可以查詢),或者向最初的線程發佈異步過程調用(「APC」,這是一個更復雜的「回調」名稱)叫它。這與您在Windows下可以獲得的「信號」非常接近。
不幸,裝甲運兵車不相當工作的人都不願意,因爲他們只在一個「報警等待狀態」,你必須通過設置ALTERTABLE做明確執行的明確點(當一個線程在等待功能中標誌或呼叫NtTestAlert
)。
Windows設計者爲什麼會這樣認爲這是「更安全」的可能原因,但從可用性的角度來看,它也更令人討厭。唉,這是它的工作原理。
請注意,重疊的I/O模型與準備就緒通知系統完全相反。 Linux操作系統。您不要詢問操作系統是否準備好要讀取,而是告訴操作系統讀取它,並且您可以通知您(或驗證)是否已完成。
相關問題
- 1. Windows核心進程之間的通信
- 2. 異步線程間通信
- 3. 進程之間的通信
- 4. 設置時間是進程中異步信號的問題嗎?
- 5. Windows中的進程間信號燈
- 6. C多個進程之間的UNIX信號量同步
- 7. Windows服務和網絡服務之間的進程間通信
- 8. 進程之間的信號查詢Linux
- 9. 進程與線程之間的通信
- 10. 異步信號主線程
- 11. Rails進程之間的通信
- 12. VHDL中進程之間的通信
- 13. luajit2進程之間的通信?
- 14. 進程與管道之間的通信
- 15. 幾個node.js進程之間的通信
- 16. 在不同計算機上的進程之間進行通信
- 17. 努力與信號進程之間的溝通
- 18. 在Android上使用Activity和Service之間的同步和異步通信
- 19. 與信號進程通信
- 20. Mutex替代進程同步/信號與異步支持?
- 21. 線程之間的信號
- 22. 異步通信
- 23. 子進程和父進程異步通信linux
- 24. 如何在Windows和主應用程序之間進行通信?
- 25. 如何在Windows應用程序和Silverlight之間進行通信?
- 26. 發信號通知線程
- 27. 兩個節目信號或共享內存之間的通信?
- 28. 異步與子進程的stdin/stdout進行通信
- 29. 線程之間可以通過LINX通信進行通信嗎?
- 30. 進程間通信
感謝您的回覆。我發現WaitForSingleObject會阻止當前進程。但在我的過程中,我不希望進程被阻塞,而是會持續運行一個循環。而且我不想檢查每個循環中的管道。這就是爲什麼我需要異步方式來通知流程。 – Arthur
然後用回調重疊'ReadFileEx'是唯一的選擇。您仍然需要「檢查」要調用的回調,因爲用戶級別的APC只在線程處於可警告等待狀態時才被調用,但通常您可以通過「例程」調用將其合併,無論如何, MsgWaitForMultipleObjects',或者你可以調用'NtTestAlert'來每次迭代(或每X次迭代一次)觸發所有未完成的APC,這非常快。不幸的是,你可以在Windows下發送信號(你可以發送_messages_,但不一樣,消息也必須被輪詢)。 – Damon