如何在窗户上清理命名管道?

时间:2013-02-08 18:29:50

标签: c++ winapi asynchronous named-pipes

我正在考虑使用命名管道来从DLL调试输出。我的DLL由一个专有的闭源程序加载,它偶尔会崩溃。问题是,当程序崩溃时,我的一些当前日志输出会丢失,因为Windows会在写入磁盘之前清除所有内容。

所以我的问题是,如果我在一个单独的进程中创建一个命名管道并从我的DLL连接到它并且我的DLL处于崩溃状态并清理过程,我仍然能够读取写入命名的数据在我的第二个进程崩溃之前管道?

我必须在非阻塞(缓冲)庄园中写入命名管道,以尽可能少地影响时序,最佳配置是什么?重叠的IO?有人可以提供良好阅读的链接吗? (我不是C ++初学者,但我是WinAPI初学者)

1 个答案:

答案 0 :(得分:1)

我不相信命名管道缓冲数据在一个伙伴失败后仍然存在。即使您设法重新打开管道,旧实例化中的任何数据都将消失。

您可以使用内存映射文件(用于进程间共享内存的Windows机制),但是您必须小心处理共享数据空间的状态 - 当进程再次唤醒时,在哪里继续写入新数据?也许是某种“我从远处读过这个”的指示。您还必须在源代码中刷写写入数据,以避免您在此问题中识别出的问题,这可能会使性能低下,但您可以先测试,然后再调整。