2013-02-18 35 views
0

我在寫一個win32應用程序,它使用namedpipe進行進程間通信。當一個進程試圖寫入文件時,它將寫入結構(告訴其他進程有多少字節和其他信息),然後再通過調用WriteFile來寫入實際數據。Namedpipe writeFIle問題Win32

另一個進程,當它正在讀取時,它讀取第一個msg,然後根據從第一個msg得到的信息讀取第二個msg。

我的問題是:

  1. 如果服務器進程寫入數據,但客戶端進程還沒有讀過,是有可能失去第一味精當客戶端在讀?例如,當服務器第二次調用WriteFile寫入實際數據時,以前的消息是否會被覆蓋?

  2. 是否有任何使用waitforsingleobject進行同步的最佳解決方案?

感謝

回答

3

出的管道是有點像一個真正的管 - 當你寫更多的管道,它不會覆蓋了已經在管道。它只是將更多的數據添加到您之前寫入管道的數據之後的管道中。

我很少發現WaitForSingleObject有用的管道。如果你想阻塞當前線程,直到它從管道接收數據,你可以做一個同步讀取,並且它會阻塞,直到有數據。如果你想阻塞,直到有任何來源的輸入,你通常需要WaitForMultipleObjectsMsgWaitForMultipleObjects,所以你的線程將在任何源輸入處理時運行。

我在管道上使用WaitForSingleObject的唯一時間是零超時,所以如果沒有管道輸入,接收機會繼續其他處理,並且每隔一段時間檢查管道是否有一些要處理的數據。雖然它最初看起來像PeekNamedPipe可以工作,但它對於其他目的(儘管它可能適用於您)讀取標題數據並確定要調用哪些其他代碼來讀取和處理整個消息非常有用。在說了這麼多之後,我覺得有必要指出,在相當長的一段時間裏,我還沒有使用命名管道編寫任何新代碼。我可以想到很少的情況,我今天甚至會考慮他們 - 我幾乎總是使用套接字來代替。

+0

謝謝你的回覆。 – lzbob 2013-02-19 23:31:00