在 C 语言中,完全缓冲、行缓冲和非缓冲是什么意思?[关闭]
- 2024-11-04 08:43:00
- admin 原创
- 31
问题描述:
我看到一行显示cat
命令输出已完全缓冲。这是什么意思?
解决方案 1:
在线 C11 标准,7.21.3/3:
当流是无缓冲的时,字符会尽快从源或目标出现。否则,字符可能会累积并以块的形式传输到主机环境或从主机环境传输出。当流是完全缓冲的时,当缓冲区已满时,字符会以块的形式传输到主机环境或从主机环境传输出。当流是行缓冲的时,当遇到换行符时,字符会以块的形式传输到主机环境或从主机环境传输出。此外,当缓冲区已满、在无缓冲流上请求输入或在需要从主机环境传输字符的行缓冲流上请求输入时,字符会以块的形式传输到主机环境。对这些特性的支持是由实现定义的,并且可能会受到
setbuf
和setvbuf
函数的影响。
7.21.3/7:
在程序启动时,预定义了三个文本流,不需要明确打开 -标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流未完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才会完全缓冲。
解决方案 2:
[为了简洁和易于复制,我在示例中使用了 Perl,但我所说明的概念并非特定于 Perl。C 的工作方式相同。 ]
缓冲决定了写入文件句柄的内容刷新(发送)到操作系统的频率。比较以下两个命令的行为:
# With buffering (default)
perl -e'$|=0; print "a"; sleep(2); print "b
";'
# Without buffering
perl -e'$|=1; print "a"; sleep(2); print "b
";'
通常,缓冲区只有在已满时才会刷新。遇到换行符时,行缓冲输出也会刷新。比较:
perl -e'print "a"; sleep(2); print "b
";'
perl -e'print "a
"; sleep(2); print "b
";'
大多数程序使用块缓冲。但是,当连接到终端时,它们通常会切换到标准输出的行缓冲。比较:
# Perl's STDOUT is line-buffered when connected to a terminal.
perl -e'print "a
"; sleep(2); print "b
";'
# Perl's STDOUT is fully buffered when connected to a pipe.
perl -e'print "a
"; sleep(2); print "b
";' | cat
# unbuffer uses pseudo-ttys to fool a program into thinking it's connected to a terminal.
unbuffer perl -e'print "a
"; sleep(2); print "b
";' | cat
解决方案 3:
无缓冲输出在读取每个字节时立即将输入文件中的字节写入标准输出。
完整缓冲输出首先按顺序读取整个文件,并将其存储在缓冲区中,然后在完成后显示缓冲区。
使用 -u 选项您可以避免这种情况。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD