我正在尝试隔离一个令人讨厌的错误,这会导致我的Linux内核崩溃。我正在向stderr打印消息,stderr被重定向到日志文件。有没有办法禁用文件访问缓冲?当内核挂起时,我将丢失缓冲区中的消息。
答案 0 :(得分:1)
实际上,默认情况下stderr
是无缓冲的,但我认为这只是在C运行时方面。我们之前用以下方法解决了这个问题:
fflush (stderr); fsync (fileno (stderr));
(虽然我们实际上已经执行了stdout
,但适用相同的规则 - fflush
可能不需要实际的stderr
,但它没有任何危害。
fflush
将C运行时缓冲区刷新到操作系统,fsync
强制写入磁盘。
请注意,这可能会严重影响您的表现。
答案 1 :(得分:0)
您可以使用fflush(stderr);
答案 2 :(得分:0)
您可以在启动应用时尝试使用setvbuf
setvbuf(stderr, NULL, _IONBF, 0);
但是,您将读取stdio缓冲区,但仍然存在“内核”缓冲区问题,除非您使用fsync,否则不会消失。但是,从用户空间跟踪内核错误可能不是最好的方法。
您可以使用串行控制台并在另一台机器上获取输出吗?这样你就可以获得oops和stderr消息