默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的?

2024-02-01

Section 7.19.3/7 of c99指出:

在程序启动时,预定义了三个文本流,无需显式打开 - 标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。

最初打开时,标准错误流未完全缓冲;当且仅当可以确定标准输入和标准输出流不引用交互设备时,标准输入和标准输出流才被完全缓冲。

所以这是有道理的。如果您要将标准输出推送到文件,您希望它完全缓冲以提高效率。

但我在标准中找不到关于输出是行缓冲还是无缓冲的提及。can't确定设备是非交互式的(即正常输出到终端)。

我问的原因是对我的答案的评论here https://stackoverflow.com/questions/3723658/does-anyone-have-an-example-of-a-conditional-statement-in-c/3723670#3723670我应该插入一个fflush(stdout);两个语句之间:

printf ("Enter number> ");
// fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }

因为我没有终止printf带换行符。任何人都可以澄清这一点吗?


C99标准没有指定这三个标准流是无缓冲的还是行缓冲的:这取决于实施。我知道的所有 UNIX 实现都有行缓冲stdin。在 Linux 上,stdout是行缓冲的并且stderr无缓冲。

据我所知,POSIX 并没有施加额外的限制。 POSIX 的fflush http://www.opengroup.org/onlinepubs/9699919799/functions/fflush.html页面在示例部分中确实注意到:

[...] 这fflush()使用函数是因为标准输出通常是缓冲的,并且提示可能不会立即打印在输出或终端上。

所以你添加的评论fflush(stdout);是正确的。


另一种选择可能是stdout无缓冲:

setbuf(stdout, NULL);
/* or */
setvbuf(stdout, NULL, _IONBF, 0);

但正如 R. 所指出的,您只能执行一次此操作,并且必须在写信给stdout或对其执行任何其他操作。 (C99 7.19.5.5 2)


我刚刚读了一篇最近的话题 http://groups.google.com/group/comp.lang.c/browse_thread/thread/76f44ab7e8ae3b8d# on comp.lang.c关于同一件事。备注之一:

Unix 约定是stdin and stdout当与终端关联时是行缓冲的,否则是完全缓冲的(也称为块缓冲)。stderr始终是无缓冲的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的? 的相关文章

随机推荐

  • Flutter:绑定尚未初始化

    将 FLutter 升级到3 0 0我在使用时遇到这个错误计算隔离 知道我已经在 main dart 中初始化了 void main async WidgetsFlutterBinding ensureInitialized 我在Flutt
  • 如何让 cscope 在搜索过程中显示完整文件路径

    当我使用以下命令搜索 C 符号或全局定义时cscope 它显示文件名和行号 我想查看完整的文件路径 以便我可以跳转到我的拱门特定文件 例如 当搜索全局定义时 switch to on cscope在 Linux 代码库上构建 我得到 Glo
  • Nodejs:查询中数组的 url.parse 问题

    http domain com action params 1 params 2 params 3 returns query params 1 2 3 params 作为名称而不是params PHP 之后 有点令人惊讶 jQuery 序
  • 自动映射器更新现有对象而不是创建新对象[重复]

    这个问题在这里已经有答案了 有什么办法可以使用吗自动映射器5 1 1更新现有对象而不是创建新对象 例如我们有一个Customer实体和一个CustomerViewModel 我们想更新现有的Customer与CustomerViewMode
  • 如何在 PHP 中通过 GET 请求传递输入名称

    我正在 PHP OOP 中构建一个网站 CMS 在这个 CMS 中 基本上有一个选项可供网站管理员更新其导航菜单项 所以它基本上看起来像这样 打印屏幕 https i stack imgur com UH1SG png 其代码如下
  • Chrome 扩展:Javascript 能否拦截文件下载并解析数据

    我正在编写一个 Chrome 扩展来自动执行我的一项日常任务 该任务的一部分是下载 csv 文件并操作数据 作为自动化的一部分 我想用 Javascript 抓取文件并让脚本操作它 问题是使用 XMLHttpRequest 获取此文件将是一
  • 如何在 SwiftUI 中为按钮创建触觉反馈

    我正在尝试在 SwiftUI 中点击按钮时实现触觉反馈 因此我尝试使用synchronousGesture 但我仍然在挣扎 我无法弄清楚水龙头何时开始 另外 Swift UI 没有实现触觉反馈 所以我想我会从 UIKit 中将它混合起来 我
  • 按两个条件分组的多个箱线图

    我在单个图中制作多个箱线图时遇到了真正的麻烦 我有五个变量 其中三个是数字 两个是因子 我想要所有三个数值变量的箱线图 但按两个因子变量分组 该图应有两组 分别为低和高 三个框为 MM ND 和 BB 图例应包含 MM ND 和 BB 的缩
  • 在pymongo中使用explain("executionStats")进行查询

    我的请求有问题 包括explain 例如 以下请求效果很好 pp pprint col find cuisine Italian name 1 address zipcode 1 address coord 1 explain 的项目清单e
  • 如何使用Jetpack compose实现交错网格布局?

    据我所知 我们只能使用Rows and Columns in Jetpack Compose显示列表 如何实现如下图所示的交错网格布局 它的正常实现使用Recyclerview交错网格布局管理器非常简单 但如何在 Jetpack Compo
  • clickhouse 将采样缩减为 OHLC 时间条间隔

    对于一张桌子 例如包含日期 价格时间序列 每个价格例如毫秒 如何将其下采样为具有时间间隔的开高低收 ohlc 行组 例如分钟 虽然使用数组的选项可以工作 但这里最简单的选项是使用按时间间隔分组的组合min max argMin argMax
  • 相当于 Akka,但适用于 .NET(并发框架)

    有没有相当于Akka http akka io 但对于 NET http doc akka io use cases http doc akka io use cases 这是 我的 正在进行的 NET Akka actor 端口 编辑 该
  • 如何使用 jquery 检查选​​择元素是否仍然“打开”/活动

    无论如何 我是否可以通过 jQuery 检测选择表单元素当前是否处于活动状态 我创建了这个小提琴来演示这个问题 http jsfiddle net E2PhT 2 http jsfiddle net E2PhT 2 当您将鼠标悬停在 搜索
  • 如何使用 PostgreSQL 计数估计来加速 Django 的管理页面?

    众所周知 当数据库表有很多行时 Django 的管理列表视图会变得相当慢 这是因为 Django 分页器默认使用 慢 PostgreSQLCOUNT query 因为估计对我们来说很好 而且速度要快得多 例如 SELECT reltuple
  • 如何在 OpenCV 中将轮廓分割为开放弧

    I have the image below and I need to split the contour to create various 30 degrees arc which I then need to fit a circl
  • 来自未知来源的 MPI 接收

    我正在 MPI 中实现一个程序 其中主进程 等级 0 应该能够接收来自其他进程的请求 这些进程要求只有根才知道的变量值 如果我按等级 0 进行 MPI Recv 我必须指定向根发送请求的进程的等级 但我无法控制它 因为进程不按顺序运行 1
  • 即使设置为原始值,angular2 formcontrol 仍保持脏状态

    当我更改输入字段中的值时 相应的表单控件将设置为脏 当我恢复更改 通过在输入字段中键入 时 表单控件保持脏状态 这是有意为之 这是一个错误还是我做错了什么 嗯 是的 它本来就是这样工作的 因为 一个控制是dirty如果用户已经改变UI 中的
  • java中@符号是什么意思?

    我知道它在出于文档目的的评论中意味着什么 但除此之外它意味着什么 我通常会用谷歌搜索这个 但每个非字母符号都会出现在结果中 The 符号表示 Java 注释 Java 注释的作用是向变量 方法 类 接口或其他语言元素添加特殊属性 这可以在声
  • ActiveRecord 迁移中序列化列的默认值

    所以我有一个序列化列 dimensions 在我的迁移中 我想将该字段设置为默认哈希 我努力了 create table shipping profiles do t t string dimensions in default gt wi
  • 默认情况下,stdout 行是缓冲的、无缓冲的还是不确定的?

    Section 7 19 3 7 of c99指出 在程序启动时 预定义了三个文本流 无需显式打开 标准输入 用于读取常规输入 标准输出 用于写入常规输出 和标准错误 用于写入诊断输出 最初打开时 标准错误流未完全缓冲 当且仅当可以确定标准