2013-02-08 23 views
1

我正在考慮使用命名管道從DLL的調試輸出。我的DLL由一個專有的閉源程序加載,它不時崩潰。問題是,當程序崩潰時,我的一些當前日誌輸出會丟失,因爲在將所有內容寫入磁盤之前,Windows會清理所有內容。如何在Windows上清除命名管道?

所以我的問題是,如果我在一個單獨的進程中創建一個命名管道,並從我的DLL連接到它,並且我的DLL在崩潰並被清理的進程將仍然能夠讀取寫入命名管道就在我的第二個進程崩潰之前?

我必須寫入非阻塞(緩衝)莊園中的命名管道,以儘可能少地影響時序,什麼是最佳配置?重疊的IO?有人能給出一個好的閱讀鏈接嗎? (我不是C++初學者,但是我是WinAPI初學者)

回答

1

我不相信命名管道緩衝數據能夠在一個合作伙伴的失敗中倖存下來。即使您設法重新打開管道,舊實例化中的任何數據都將消失。

您可以使用內存映射文件(Windows機制用於進程間共享內存),但是您必須小心處理共享數據空間的狀態 - 當進程再次喚醒時,要恢復寫入新數據的位置?也許是某種「我讀過這麼多」的指示。您還需要在源代碼中寫入數據以避免您在此問題中識別的問題,這可能會導致性能低於您的性能,但您可以先測試,稍後調整。

+0

謝謝,問題是一些瘋狂的人決定在某些例程中超時2毫秒,所以我根本無法刷新任何緩衝區或導致錯誤,非常令人沮喪。 – odinthenerd 2013-02-08 19:07:50

+0

如果我初始化一個內存映射文件,其中所有\ 0's大於我的最大期望調試,並且源崩潰,那麼接收器就可以讀取,直到它連續遇到幾個\ 0爲止。我需要的只是數據仍在那裏 – odinthenerd 2013-02-08 19:11:04

+0

是的,只要你確信你永遠不會看到「數據結束」模式合法。試圖想想所有的問題,你需要什麼取決於所需的穩健性水平。還有,如果你確實溢出了映射文件會發生什麼?可能重置後重新開始,但重置多少? – 2013-02-08 19:12:48