簡體   English   中英

使用重疊的命名管道在Windows上同時讀寫

[英]Usage of overlapped named pipe for simultaneous read and write on Windows

我有一個創建為重疊的管道句柄。 我需要並行讀取和寫入數據。 我怎樣才能做到這一點?

命名管道服務器使用重疊I / O文檔頁面顯示了如何讀取和寫入許多管道的示例,但“它避免了對單個管道實例的同時操作”。

在Windows上使用C ++執行此操作的正確方法是什么? 我無法提供正確的示例,也無法提供有關該主題的一些幫助。

當沒有數據要讀取時,我面臨的主要問題是正常的ReadFile會阻塞,最終我無法用WriteFile寫入。 我還沒有找到任何方法可以告訴我有什么東西要讀,不要阻止。 據我所知,我需要傳遞OVERLAPPED結構,但不知道如何在並行讀寫一個管道(不是很多)的情況下使用它。

它應該是可能的,因為在同步和重疊管道I / O中說

重疊操作使得一個管道可以同時讀取和寫入數據,並且單個線程可以在多個管道句柄上執行同時的I / O操作。

您需要做的就是為每個同步操作提供不同的OVERLAPPED結構。 在您的情況下,所有這些意味着兩個線程中的每一個都需要自己的OVERLAPPED結構。 由於線程可能會運行不同的函數,因此除非您使用全局變量搞砸了,否則這應該會自動發生。

請注意,從那個樣本開始過度復雜化,重點是使用重疊的I / O來避免需要多個線程。

相反,假裝您使用非重疊I / O編寫兩個函數中的每一個,但無論何時調用ReadFile或WriteFile,都要包含一個帶有事件句柄的有效OVERLAPPED結構,並跟進WaitForSingleObject。 您應該知道一些事情:您必須確保每個線程都創建自己的事件對象,並且您必須處理I / O操作立即完成的情況(即,返回ERROR_SUCCESS而不是ERROR_IO_PENDING)。 否則,這一切都相當簡單。

如果您無法使其正常工作,請顯示您的代碼。

正如管道文檔所說,一個進程寫道,另一個進程讀取。 如果要讀取和寫入,則需要兩個管道,一個用於“寫入另一個進程”,另一個用於“從另一個進程讀取數據”。

[這不是Windows獨有的,但由於您在詢問Windows管道,我認為最好給出Windows文檔。 Linux / Unix管道是一樣的 - 它們有兩端,一個讀端和一個寫端]

當然,正如評論所說,似乎Windows文檔相當矛盾(我一次只在一個方向上使用過windows管道)。

雖然這個例子不是同時讀寫,但我認為它可以相對容易地改變,以便它可以。

我懷疑(但由於代碼未發布)問題出在ReadFile調用或設置管道本身。 對ReadFile的重疊調用是異步的,在檢查結果之前,您需要等待與WaitForMultipleObjects重疊結構相關的事件。

顯然,如果您同時進行讀寫,則需要一個重疊的結構用於讀取,一個用於寫入,以指示哪一側“已完成”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM