c - 如何清除 UNIX 系统上 tty 输入队列中的未读数据?

标签 c unix buffer

我的程序只需要从标准输入中读取一个字符,所以我使用 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/

相关文章:

c++ - C 风格字符串和 c++ std::string 的函数

C Fork程序输出解释

c - 为什么这些案件没有事先声明?

c - Unix 和 C 中的输出重定向

C 警告 : Function was used with no prototype before its definition

unix - Unix系统文件表

javascript - 如何对 Javascript Unix 时间戳数组进行排序

ruby - 使用 progressbar/ruby-progressbar gem 时出现 Zlib::BufError

c - 程序求助!用户点击后进入程序结束

c++ - 使用另一个宏生成宏的名称(C 预处理器)