如何用WriteFile写错误

How to write to stderr with WriteFile

本文关键字:错误 WriteFile 何用      更新时间:2023-10-16

是否有可能获得HANDLE参考标准错误输出,可以在Windows上使用WriteFile编写?

我问的原因是我正在为自己写一些日志工具。我试着把数据直接给系统:

  • 避免任何未被冲洗的潜在问题和
  • 允许系统在不需要锁的情况下将来自不同线程的消息交织在一起(如果这真的有效是另一个问题)。

应用程序是windows子系统,所以它应该只写在任何地方,如果应用程序实际上继承了标准错误?如果可能的话,那就是。

注意:我已经有日志sink到OutputDebugString。在其他几个平台上也是一样的。对于file,它使用低级API来避免任何额外的缓冲(因为消息已经在堆栈上缓冲区中组装并且需要立即刷新)。我只是想重用代码来写文件来写标准错误

使用GetStdHandleSTD_ERROR_HANDLE

HANDLE stderr = GetStdHandle(STD_ERROR_HANDLE);
WriteFile(stderr, /*...*/);

stderr不是Windows原生的,直到进程初始化C运行时库子系统(?)才打开。

选择WriteFile是因为它是最低级别的写入API,而WriteFile可能会破坏stderr的内部一致性,这显然没有适当的锁定。

为了调试/跟踪目的,Windows SDK提供了OutputDebugString API。许多Windows程序员使用这个API和DebugView进行开发。

对于一般的日志记录,将事件写入事件查看器会更有用。

我推荐使用vc++ CRTDBG库(链接)。真的很好吃!