【问题标题】:Testing if input or output is pending in a buffered stream测试输入或输出是否在缓冲流中挂起
【发布时间】:2021-09-04 14:30:03
【问题描述】:

是否有一种可移植的方式在 C 程序中测试某些输入或输出是否在缓冲流(例如 stdinstdout)中挂起?

【问题讨论】:

  • kbhit() 几乎可以做到这一点,而且它几乎是可移植的:-D
  • @tevemadar: kbhit() 不这样做:它测试是否可以从终端系统句柄获得某些输入。如果输入已经从系统中检索到,例如scanf()kbhit() 将返回 0。

标签: c stdio


【解决方案1】:

我不这么认为。对于stdout,您可以通过是否导致缓冲区被刷新来自己跟踪这一点。对于stdin,我认为最接近的方法是使用select/poll 检查文件描述符(尽管这可能会破坏可移植性)。归根结底,FILE 是一种不透明的数据类型,只公开了这么多。

【讨论】:

  • 检查文件描述符只会查询内核是否有未读输入。但是,它不会查询 C 标准库的输入缓冲区(即FILE* 的缓冲区)。因此,例如,如果应用程序使用getchar() 读取1 个字节,那么C 标准库可能会从内核(文件描述符)读取7 个字节到FILE * 的输入缓冲区,并将1 个字节传递给@987654329 @。现在,查询内核的文件描述符可能会返回没有进一步的输入,尽管 C 标准库的输入缓冲区中仍有 6 个未读字节。
  • 是的,我知道。这就是为什么我说这是最接近的东西。
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2016-07-14
  • 1970-01-01
  • 2021-12-19
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多