Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 标准文件;但是没有缓冲_Linux_File_Redirect_Stderr - Fatal编程技术网

Linux 标准文件;但是没有缓冲

Linux 标准文件;但是没有缓冲,linux,file,redirect,stderr,Linux,File,Redirect,Stderr,我正试图找出一个令人讨厌的bug,它使我的linux内核崩溃。我正在将消息打印到stderr,stderr被重定向到日志文件。有没有办法禁用文件访问上的缓冲?当内核挂起时,我将丢失缓冲区中的消息。您可以使用fflush(stderr)强制刷新缓冲区您可以使用fflush(stderr)强制刷新缓冲区实际上,stderr在默认情况下是无缓冲的,但我认为这只是在C运行时方面。我们以前通过以下方式解决了此问题: fflush (stderr); fsync (fileno (stderr)); (虽

我正试图找出一个令人讨厌的bug,它使我的linux内核崩溃。我正在将消息打印到stderr,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已经非缓冲了吗?我认为唯一的问题是文件缓冲区。