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

Jus*_*ing 7 c unix buffer

我的程序必须从标准输入中只读取一个字符,所以我使用read(0, buffer, 1).但是如果用户插入多个单个字符,它们会保留在某个缓冲区中,当我read再次调用它时,它们仍然存在.

那么,我怎么能丢弃这些字符呢?我希望当我read再次呼叫时,缓冲区中充满了新角色,而不是旧角色.

一个例子:我有一个read(0, buffer, 1)用户写abcde.我的缓冲区包含一个(和它是正确的),但后来我打电话read(0, buffer, 1)再次,我想下一个字符从现在写的用户,而不是b之前写的.

Jon*_*ler 18

POSIX答案是tcflush():刷新非传输输出数据,非读取输入数据或两者.还有tcdrain()等待输出的传输.他们一直在POSIX,因为有一个POSIX标准(1988年的试用版),虽然我不记得曾经直接使用它们.

示例程序

编译此代码,以便调用生成的程序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;
}
Run Code Online (Sandbox Code Playgroud)

示例对话框

$ ./tcflush
abc
a
def
d
$
Run Code Online (Sandbox Code Playgroud)

看起来像医生订购的那样.没有第二个tcflush(),shell抱怨它无法找到命令ef.tcflush()如果您愿意,可以在第一次阅读之前放置一个.这对我的简单测试没有必要,但如果我使用sleep 10; ./tcflush然后输入,它会有所作为.

在x86/64计算机上以及Mac OS X 10.7.4上测试RHEL 5 Linux.


Edw*_*uck 5

当您的程序要开始读取字符时,它必须耗尽现有字符的缓冲区,然后等待读取该字符。

否则,它将读取输入的最后一个字符,而不是现在之后输入的最后一个字符。

自然,您无需对读取的字符进行任何操作;但是,您确实需要阅读它们。