How can I flush unread data from a tty input queue on a UNIX system?

The POSIX answer is tcflush(): flush non-transmitted output data, non-read input data, or both. There is also tcdrain() which waits for output to be transmitted. They’ve been in POSIX since there was a POSIX standard (1988 for the trial-use version), though I don’t recall ever using them directly.

Example program

Compile this code so the resulting program is called 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;
}

Example dialog

$ ./tcflush
abc
a
def
d
$

Looks like what the doctor ordered. Without the second tcflush(), the shell complains that it can’t find a command ef. You can place a tcflush() before the first read if you like. It wasn’t necessary for my simple testing, but if I’d used sleep 10; ./tcflush and then typed ahead, it would make a difference.

Tested on RHEL 5 Linux on an x86/64 machine, and also on Mac OS X 10.7.4.

Leave a Comment