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

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

$ ./tcflushabcadefd$

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.


When your program wants to start reading characters, it must drain the buffer of existing characters and then wait to read the character.

Otherwise, it will read the last character entered, not the last character entered after right now.

Naturally, you do not need to do anything with the read characters; but, you do need to read them.