【发布时间】:2011-08-03 16:53:46
【问题描述】:
这个问题有点远,但我想也许有人知道一个聪明的解决方案。
我在 Windows 中使用 RTS 游戏(Kane's Wrath)有一个特殊情况,它可以保存重播文件。不利的对手有可能在游戏中引发崩溃。在这种情况下,拥有尽可能完整的回放文件将是有利的。
但是,回放文件输出似乎是缓冲的,并且只出现在 4096 字节的集合中(这是很多游戏时间)。我想知道是否有可能以某种方式强制程序在发生崩溃时刷新其所有文件句柄。是否有一些内置的操作系统功能允许禁用应用程序的缓冲?
如果做不到这一点,我可能想为这个问题编写一个启动器/包装器。我想它应该注入一些代码,a)为崩溃安装信号处理程序(是 SIGSEGV 吗?),b)重定向CreateFile(我知道程序使用跟踪跟踪)来存储句柄。然后崩溃处理程序将使用FlushFileBuffers 刷新所有处理程序。
或者是否有可能获得另一个进程的打开文件句柄?
这是否有可能奏效,您能否就如何以最少的干扰最好地实现这一目标给我任何建议?
小更新: @CatPlusPlus 建议 Detours 挂钩程序,拦截文件打开调用并将其修改为无缓冲。这可能是解决方案!
【问题讨论】:
-
没有内置的操作系统功能可以做到这一点,怎么可能呢?操作系统甚至不知道缓冲正在发生——它所看到的是,每隔一段时间,有人说“嘿,我想向这个文件写入 4096 字节”并且它做到了。
-
@Adam:嗯,类似于在 Linux 上你有
ulimit告诉程序不要做某些事情。我想也许操作系统可以说,“对于下一个进程,我们禁用所有 IO 缓冲”,因为 IO 最终使用系统调用。