我的程序只需要从标准输入中读取一个字符,所以我使用 read(0, buffer, 1)
。
但是,如果用户插入多个字符,它们将保留在某个缓冲区中,当我再次调用 read
时,它们仍然存在。
那么,我怎样才能丢弃这些字符呢?
我希望当我再次调用 read
时,缓冲区将填充新字符,而不是旧字符。
一个例子:
我有一个 read(0, buffer, 1)
并且用户写入 abcde。我的缓冲区包含 a(这是正确的),但随后我再次调用 read(0, buffer, 1)
并且我想要下一个字符由用户从现在开始编写,而不是之前编写的b。
最佳答案
POSIX 答案是 tcflush()
: 刷新未传输的输出数据、未读取的输入数据或两者。还有tcdrain()
等待输出被传输。自从有 POSIX 标准(1988 年试用版)以来,它们就一直在 POSIX 中,尽管我不记得曾经直接使用过它们。
示例程序
编译此代码,生成的程序称为 tcflush
:
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main(void)
{
char buffer[20] = "";
read(0, buffer, 1);
printf("%c\n", buffer[0]);
tcflush(0, TCIFLUSH);
read(0, buffer, 1);
printf("%c\n", buffer[0]);
tcflush(0, TCIFLUSH);
return 0;
}
示例对话框
$ ./tcflush
abc
a
def
d
$
看起来像医生嘱咐的那样。如果没有第二个 tcflush()
,shell 会提示找不到命令 ef
。如果愿意,您可以在第一次读取之前放置一个 tcflush()
。这对我的简单测试来说不是必需的,但如果我使用了 sleep 10; ./tcflush
然后提前输入,会有不同。
在 x86/64 机器上的 RHEL 5 Linux 和 Mac OS X 10.7.4 上测试。
关于c - 如何清除 UNIX 系统上 tty 输入队列中的未读数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10938882/