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
", buffer[0]);
tcflush(0, TCIFLUSH);
read(0, buffer, 1);
printf("%c
", 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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…