如何用WriteFile写错误
How to write to stderr with WriteFile
是否有可能获得HANDLE
参考标准错误输出,可以在Windows上使用WriteFile
编写?
我问的原因是我正在为自己写一些日志工具。我试着把数据直接给系统:
- 避免任何未被冲洗的潜在问题和
- 允许系统在不需要锁的情况下将来自不同线程的消息交织在一起(如果这真的有效是另一个问题)。
应用程序是windows子系统,所以它应该只写在任何地方,如果应用程序实际上继承了标准错误?如果可能的话,那就是。
注意:我已经有日志sink到OutputDebugString
。在其他几个平台上也是一样的。对于file,它使用低级API来避免任何额外的缓冲(因为消息已经在堆栈上缓冲区中组装并且需要立即刷新)。我只是想重用代码来写文件来写标准错误
使用GetStdHandle
和STD_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库(链接)。真的很好吃!
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- WriteFile返回错误代码995
- WriteFile返回错误1784
- 如何用WriteFile写错误