stderr to file;但没有缓冲

时间:2010-05-27 08:26:19

标签: linux file redirect stderr

我正在尝试隔离一个令人讨厌的错误,这会导致我的Linux内核崩溃。我正在向stderr打印消息,stderr被重定向到日志文件。有没有办法禁用文件访问缓冲?当内核挂起时,我将丢失缓冲区中的消息。

3 个答案:

答案 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消息