Linux 标准文件;但是没有缓冲
我正试图找出一个令人讨厌的bug,它使我的linux内核崩溃。我正在将消息打印到stderr,stderr被重定向到日志文件。有没有办法禁用文件访问上的缓冲?当内核挂起时,我将丢失缓冲区中的消息。您可以使用Linux 标准文件;但是没有缓冲,linux,file,redirect,stderr,Linux,File,Redirect,Stderr,我正试图找出一个令人讨厌的bug,它使我的linux内核崩溃。我正在将消息打印到stderr,stderr被重定向到日志文件。有没有办法禁用文件访问上的缓冲?当内核挂起时,我将丢失缓冲区中的消息。您可以使用fflush(stderr)强制刷新缓冲区您可以使用fflush(stderr)强制刷新缓冲区实际上,stderr在默认情况下是无缓冲的,但我认为这只是在C运行时方面。我们以前通过以下方式解决了此问题: fflush (stderr); fsync (fileno (stderr)); (虽
fflush(stderr)强制刷新缓冲区
您可以使用fflush(stderr)强制刷新缓冲区代码>实际上,stderr
在默认情况下是无缓冲的,但我认为这只是在C运行时方面。我们以前通过以下方式解决了此问题:
fflush (stderr); fsync (fileno (stderr));
(虽然我们实际上对stdout执行了该操作,但同样的规则也适用-实际的fflush
对于stderr
可能不是必需的,但它没有坏处)
fflush
将C运行时缓冲区刷新到操作系统,而fsync
强制写入磁盘
请记住,这可能会严重影响您的性能。实际上,
stderr
在默认情况下是无缓冲的,但我认为这只是在C运行时方面。我们以前通过以下方式解决了此问题:
fflush (stderr); fsync (fileno (stderr));
(虽然我们实际上对stdout执行了该操作,但同样的规则也适用-实际的fflush
对于stderr可能不是必需的,但它没有坏处)
fflush
将C运行时缓冲区刷新到操作系统,而fsync
强制写入磁盘
请记住,这可能会严重影响您的性能。启动应用程序时,您可以尝试使用
setvbuf
setvbuf(stderr, NULL, _IONBF, 0);
但是,您将读取stdio缓冲区,但仍然存在“内核内”缓冲区问题,除非您使用fsync,否则该问题不会消失。然而,从用户空间跟踪内核bug并不是最好的方法
您可以使用串行控制台在另一台机器上获取输出吗?通过这种方式,您可以同时获得oops和stderr消息您可以在启动应用程序时尝试使用
setvbuf
setvbuf(stderr, NULL, _IONBF, 0);
但是,您将读取stdio缓冲区,但仍然存在“内核内”缓冲区问题,除非您使用fsync,否则该问题不会消失。然而,从用户空间跟踪内核bug并不是最好的方法
您可以使用串行控制台在另一台机器上获取输出吗?通过这种方式,您可以同时获得oops和stderr消息许多文件/库都可以强制执行fflush。还不是stderr已经非缓冲了吗?我认为唯一的问题是文件缓冲区。有很多文件/库可以强制执行fflush。还不是stderr已经非缓冲了吗?我认为唯一的问题是文件缓冲区。