2013-02-08 241 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