我對管道知之甚少,但已經用Visual C++中的代碼連接了兩個進程。管道工作正常,但我需要將錯誤處理添加到同一個管道中,因此想知道如果創建它的服務器崩潰了,管道將會發生什麼情況,並且如何從客戶端進程識別它?如果服務器崩潰,命名管道會發生什麼?
如果客戶端進程在服務器崩潰後嘗試訪問同一管道(如果沒有錯誤處理),那麼會發生什麼?
編輯: 將帶來哪些影響那裏的記憶,如果我繼續創造新的管道(比如說通過使用系統時間作爲管道名),而此前是因爲服務器崩潰的壞了?這些破碎的管道是否會從內存中移除?
我對管道知之甚少,但已經用Visual C++中的代碼連接了兩個進程。管道工作正常,但我需要將錯誤處理添加到同一個管道中,因此想知道如果創建它的服務器崩潰了,管道將會發生什麼情況,並且如何從客戶端進程識別它?如果服務器崩潰,命名管道會發生什麼?
如果客戶端進程在服務器崩潰後嘗試訪問同一管道(如果沒有錯誤處理),那麼會發生什麼?
編輯: 將帶來哪些影響那裏的記憶,如果我繼續創造新的管道(比如說通過使用系統時間作爲管道名),而此前是因爲服務器崩潰的壞了?這些破碎的管道是否會從內存中移除?
IIRC的的ReadFile或WriteFile函數將返回FALSE,GetLastError()將返回STATUS_PIPE_DISCONNECTED
我想這樣的處理在你的代碼中實現,如果不是你應該更好地將其添加;-)
我只是想把它扔到那裏。
如果您想要在兩個應用程序之間傳輸數據的可生存方法,您可以考慮使用MSMQ或甚至引入BizTalk或其他消息平臺。
有幾件事情要考慮:
這些上下文中的每一個表示潛在的數據丟失。如果數據丟失是不可接受的,那麼命名管道不是您應該使用的機制。相反,你需要以某種方式堅持消息。
MSMQ,存儲到數據庫,甚至利用Biztalk都可以處理消息本身的生存性。
如果發生1或3,那麼命名管道將消失,並且必須由服務器應用程序的新實例重新創建。如果#2發生,那麼管道將不會消失,直到有人重新啓動服務器或殺死服務器應用程序並再次啓動。
無論如何,客戶端應用程序需要處理上述問題。他們歸結爲連接失敗的問題。根據客戶端的具體情況,您可能會進入等待狀態,並且每隔一段時間都要ping服務器以查看它是否再次返回。
不知道數據和通信過程的性質,很難推薦適當的方法。
你確定MailSlots持久嗎?也許你的意思是MQ像MSMQ,而不是MailSlot? – user1121956 2012-12-03 10:14:07
@ user1121956:哇,你說得對。我的意思是MSMQ,而不是郵件插槽。當擁有的進程關閉時,郵件槽被終止並且未讀消息被刪除。所以,那肯定不是一個好主意。 – NotMe 2012-12-03 18:40:31
請注意,添加錯誤處理的最佳方法是檢查您調用的所有函數的文檔,以查看其所有可能的錯誤響應。把它們全部處理掉,也許考慮到造成這種錯誤的條件。你在做什麼,正在考慮一個特定的錯誤條件,並找出它引起的錯誤反應。除非你非常有想象力,否則結果就是你的代碼中會存在一些未處理的錯誤。 – 2010-10-10 18:03:30
嗨,我被告知考慮服務器崩潰,並且不知道在這種情況下管道會發生什麼情況,你能幫忙嗎? – Sneha 2010-10-10 18:07:41
我想弄清楚你的意思是「服務器崩潰」你的意思是如果服務器本身死亡,或者你的意思是如果你的應用程序崩潰? – NotMe 2010-10-11 16:34:10