Как удалить непрочитанные данные из очереди ввода tty в системе UNIX?

Моя программа должна читать только один символ из стандартного ввода, и поэтому я используюread(0, buffer, 1). But if the user insert more than one single character, they remain in some buffer and when I call a read снова они все еще там.

Итак, как я могу отказаться от этих персонажей? Я хочу, чтобы, когда я звонюread опять же, буфер заполняется новым символом, а не старыми.

Пример: Яread(0, buffer, 1) и пользователь пишетabcde, Мой буфер содержитa (и это правильно), но потом я звонюread(0, buffer, 1) снова, и я хочу, чтобы следующий символ был написан пользователем, а неb написано раньше.

Ответы на вопрос(2)

tcflush(): flush non-transmitted output data, non-read input data, or both, Существует такжеtcdrain() которая ждет вывода для передачи. Они были в POSIX с тех пор, как существовал стандарт POSIX (1988 г. для пробной версии), хотя я не помню, чтобы когда-либо использовал их напрямую.

Example program

Скомпилируйте этот код, чтобы получившаяся программа называлась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
$

Похоже, что доктор прописал. Без второгоtcflush()оболочка жалуется, что не может найти командуef, Вы можете разместитьtcflush() перед первым прочтением, если хотите. Это не было необходимым для моего простого тестирования, но если бы я использовалsleep 10; ./tcflush и затем напечатал вперед, это имело бы значение.

Протестировано на RHEL 5 Linux на компьютере x86 / 64, а также на Mac OS X 10.7.4.

Решение Вопроса

она должна опустошить буфер существующих символов и затем ждать, чтобы прочитать символ.

В противном случае он будет читать последний введенный символ, а не последний введенный послеright now.

Естественно, вам не нужно ничего делать с прочитанными символами; но вы должны прочитать их.

 JustTrying07 июн. 2012 г., 22:37
А как можно слить буфер существующих символов?
 07 июн. 2012 г., 22:07
поочередно, когда вы читаете 1 символ, продолжайте читать, пока не получите eof или EAGAIN.
 07 июн. 2012 г., 22:13
@evilotto Хотя ваше предложение даст вам последний введенный символ, оно действительно не решит проблему определения, был ли последний введенный символ введен до того, как вы захотели сделать снимок или после него. Чтобы убедиться, что он был введен позже, вам нужно опустошить канал, а затем захватить персонажа.
 07 июн. 2012 г., 22:38
С циклом while, который читает по одному символу за раз, пока нет доступных символов для чтения.

Ваш ответ на вопрос