我什么时候可以期待打印到控制台的“stdout”?

我什么时候可以期待打印到控制台的“stdout”?,第1张

概述我什么时候可以期待打印控制台的“stdout”?

我知道这是因为stdout的缓冲,但是我什么时候可以期待stdout的输出在下面的proggram。 如果我运行,我总是得到“stderr”作为输出。 如果我添加' n'或fflush(标准输出),那么只有我得到两个语句。 如果我不添加' n'或fflush(stdout),我没有得到“stdout”作为输出。 什么时候我会得到所有缓冲的“标准输出”作为输出,如果我不添加' n'或fflush(标准输出)。

#include <stdio.h> #include <unistd.h> int main() { for(;;) { fprintf(stdout,"stdout"); fprintf(stderr,"stderr"); sleep(1); } return 0; }

如何为USB设备设置空闲和closures超时值

创build一个没有类名的c ++库

XTC文件读取错误

如何在windows上调用ELF函数

游标在input时离开窗口(ncurses)

事实上,一个新的行或刷新,因为默认情况下, stdout是线路缓冲时,它是指一个终端设备。

更准确地说:标准输入和标准输出是完全缓冲的,当且仅当它们不涉及交互设备时。 标准错误永远不会被完全缓冲。

关于行缓冲,从APUE引用:

线路缓冲有两个注意事项。 首先,标准I / O库用于收集每行的缓冲区大小是固定的,因此如果在写入换行符之前填充此缓冲区,则可能会发生I / O。 其次,无论何时从(a)非缓冲流或(b)线缓冲流(需要从内核请求数据)通过标准I / O库请求输入时,所有行缓冲输出流都将被刷新。 (b)中限定符的原因是请求的数据可能已经存在于缓冲区中,不需要从内核读取数据。 显然,来自非缓冲流(a)的任何输入都要求从内核获得数据。

要将其更改为无缓冲,请使用setvbuf :

setvbuf(stdout,NulL,_IONBF,0);

输出发送到stderr通常立即打印。 这是标准的错误输出。 当然,应该立即显示错误,因此立即刷新存在的任何缓冲区。

标准输出,另一方面,被缓冲。 获得打印出来的缓冲区因语言不同而不同,但通常至少需要以下两项之一: /n或某种其他类型的换行符或.flush(); 。 如果您不提供这些选项,那么通常您必须等待缓冲区填满 。 这可能需要很长时间,因为它几乎完全取决于缓冲区的大小。

按照惯例,处理流的方式是,你可以根据需要向其中插入尽可能多的信息,然后调用.flush() 。 如果缓冲区恰好在此期间被填满,则数据被发送到任何地方,并且缓冲区开始再次填满。

在这里,虽然,你正在填充一个缓冲区,接受文本。 与二进制信息相比,文本并不占用太多的空间(这是一个非常主观的陈述,应该被松散地解释),所以填充缓冲区可能需要相当长的一段时间。

最好的做法是让您手动刷新流( stdout ),一旦你“喂”了你想要打印的所有文本。

fprintf默认是行缓冲的。 你可以通过调用setvbuf来改变行为。 它可以让你把它设置为“无缓冲”,“行缓冲”或“完全缓冲”。

总结

以上是内存溢出为你收集整理的我什么时候可以期待打印到控制台的“stdout”?全部内容,希望文章能够帮你解决我什么时候可以期待打印到控制台的“stdout”?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1282852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存