缓冲和无缓冲的输入[英] Buffered and Unbuffered inputs in C

本文是小编为大家收集整理的关于缓冲和无缓冲的输入的处理方法,想解了缓冲和无缓冲的输入的问题怎么解决?缓冲和无缓冲的输入问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

是否有任何方法来弄清楚input是否是buffered或unbuffered(除手动页面)是什么?我们不能通过查看函数的名称来弄清楚吗? 也适用于echoing和nonechoing... 为了快速参考,在哪里找到具有Buffered,Unbuffered,echoing和nonechoing输入的详细信息的列表?

推荐答案

所有用于读取的FILE的函数可以表现出 "缓冲"或"未缓冲的"行为,以及/em>"回声"或"不回应"行为.什么控制这些东西不是您使用的功能,而是在流和/或其底层文件描述符上的设置.

  • 标准库函数 setvbuf 可用于通过C库启用或禁用输入(和输出)的缓冲.这对操作系统没有影响了缓冲.有三种可能的模式:"完全缓冲"(读取或写入实质性块); "行缓冲"(缓冲区直到'\n'字符被读取或写入,但不超出);和"无缓冲"(所有读写并立即写入操作系统).

  • 新FILE对象(包括stdin和朋友)的默认缓冲是定义的. UNIXY C库通常默认为全部FILE S完全缓冲,有两个例外. stderr默认为无缓冲.对于任何其他FILE,如果在第一次实际读取或写入时尚未使用它,并且 isatty 为底层文件描述符是true,然后FILE变为行缓冲.

  • 一些c库提供扩展功能,例如, __flbf 和朋友在Linux和solaris上,用于读取一些由setvbuf控制的设置.请记住,如上所述,如果尚未明确设置,则缓冲模式可以在第一实际读取或写入时改变.

如果输入来自文件,则setvbuf是您唯一的旋钮.如果输入来自某种通信通道,则可能有其他旋钮:

  • 在POSIX符合系统上(读取"除窗外的所有内容"),程序可以要求终端输入的几种不同模式中的任何一种.其中,制作的最重要的区别是之间的"规范"和"非洲".规范模式中的终端表现出缓冲和回波. (这种缓冲是从缓冲中分开如果尚未用于禁用它,则C库可以执行C库.)非规范模式允许您单独切换缓冲和回声. 低级POSIX终端接口是广泛的,复杂,并允许您读取和写下所有这些设置.

  • 如果您认为要将终端放在非规范模式下,请在编写一堆针对低级POSIX API的代码之前,请先考虑 readline ncurses 库会使您的生活更轻松.

  • 如果您正在从管道上读取,您将符合谁写作的怜悯;您无法控制所获得的块的大小.

  • 如果您正在从套接字读取,可以通过仔细使用 recvmsg ,但没有保证.

  • 我不知道它是如何在windows上的.

其他推荐答案

ISO/IEC 9899-1999 C99语言标准

5.1.2.3程序执行

...

5)交互式设备的输入和输出动态应在规定的情况下进行 7.19.3.这些要求的意图是不缓解或线缓冲的输出 尽快出现,以确保在之前提示消息实际出现 等待输入的程序. ...

7.19.3文件

...

3)当流是无缓冲的,字符旨在从源或在源中出现 目的地尽快.否则可能会累积字符和 作为块发送到主机环境或从主机环境传输.当流完全缓冲时, 字符旨在将主机环境发送到主机环境作为块 填充缓冲区.当流是行缓冲时,字符旨在为 当新行字符是时,将送至主机环境或从主机环境发送到块 遭遇.此外,字符旨在将其作为块发送到主机 填充缓冲区时的环境,在未禁止的流上请求输入时,或 在需要传输的行缓冲流上请求输入时 来自主机环境的字符.对这些特征的支持是 实现定义,可能通过setBuf和setVbuf函数影响. ...

7)在程序启动时,预定义三个文本流,不需要明确打开 - 标准输入(用于读取传统输入),标准输出(用于写入 传统输出)和标准错误(用于编写诊断输出).最初 打开后,标准错误流不完全缓冲;标准输入和标准 如果且仅当可以确定流不引用时,则输出流完全缓冲 到一个交互式设备.

其他推荐答案

您可以将缓冲区与包含stdin的文件相关联,其中setvbuf().您可以将缓冲模式更改为完整,行或无.

本文地址:https://www.itbaoku.cn/post/358949.html